dfs栈
#include<iostream>
#include<stack>
using namespace std;
static const int N=100;
static const int white=0;
static const int gray=0;
static const int black=0;
int n,M[N][N];
int color[N],d[N],f[N],tt;
int nt[N];
int next(int u){
	for(int v=nt[u];v<n;v++){
		nt[u]=v+1;
		if(M[u][v])return v;
	}
	return -1;
}
void dfsvisit(int r){
	for(int i=0;i<n;i++)nt[i]=0;
	
	stack<int>s;
	s.push(r);
	color[r]=gray;
	d[r]=++tt;
	
	while(!s.empty()){
		int u=s.top();
		int v=next(u);
		if(v!=-1){
			if(color[v]==white){
				color[v]=gray;
				d[v]=++tt;
				s.push(v);
			}
		}
		else {
			s.pop();
			color[u]=black;
			f[u]=++tt;
		}
	}
}
void dfs(){
	for(int i=0;i<n;i++){
		color[i]=white;
		nt[i]=0;
	}
	tt=0;
	
	for(int u=0;u<n;u++){
		if(color[u]==white)dfsvisit(u);
	}
	for(int i=0;i<n;i++){
		cout<<i+1<<" "<<d[i]<<" "<<f[i]<<endl;
	}
}
int main(){
	int u,k,v;
	
	cin>>n;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			M[i][j]=0;
		}
	}
	
	for(int i=0;i<n;i++){
		cin>>u>>k;
		u--;
		for(int j=0;j<k;j++){
			cin>>v;
			v--;
			M[u][v]=1;
		}
	}
	dfs();
	return 0;
	
}
                    
                
                
            
        
浙公网安备 33010602011771号