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;

}

posted @ 2020-11-04 12:09  罗霖锦  阅读(140)  评论(0编辑  收藏  举报