图的开始--第一天打卡之图的遍历(dfs)
作者:
lgd123
,
2021-07-25 18:42:14
,
所有人可见
,
阅读 244
----------
**
#include<iostream>
#include<cstring>
#define white 0;
#define gray 1;
#define black 2;
using namespace std;
const int N = 110;
int n,m[N][N];
int color[N],d[N],f[N],hh;
void dfs_hexin(int u)
{
color[u]=gray;
d[u]=++hh;
for(int i=0;i<n;i++)
{
if(m[u][i]==0) continue;
if( color[i]==0 )
{
dfs_hexin(i);
}
}
color[u]=black;
f[u]=++hh;
}
void dfs_paimian()
{
memset(color,0,sizeof(color));
hh=0;
for(int i=0;i<n;i++)
{
if(color[i]==0) dfs_hexin(i);
}
for(int i=0;i<n;i++)
{
cout<<i+1<<" "<<d[i]<<" "<<f[i]<<endl;
}
}
int main()
{
int b,c,d;
cin>>n;
memset(m,0,sizeof(m));
for(int i=0;i<n;i++)
{
cin>>b>>c;
b--;
for(int j=0;j<c;j++)
{
cin>>d;
d--;
m[b][d]=1;
}
}
dfs_paimian();
system("pause");
return 0;
}
----------
**
#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
const int N = 110;
const int WHITE = 0;
const int GRAY = 1;
const int BLACK = 2;
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 dfs_hexin(int r)
{
for(int i=0;i<n;i++) nt[i] = 0;
stack<int> s;
s.push(r);
color[r]=1;
d[r]=++tt;
while(!s.empty())
{
int u = s.top();
int v = next(u);
if(v!=-1)
{
if(color[v]==0)
{
color[v]=1;
d[v]=++tt;
s.push(v);
}
}else{
s.pop();
color[u]=2;
f[u]=++tt;
}
}
}
void dfs()
{
for(int i=0;i<n;i++)
{
color[i]=0;
nt[i] = 0;
}
tt = 0;
for(int u = 0;u<n;u++)
{
if(color[u]==0) dfs_hexin(u);
}
for(int i = 0;i < n;i++)
{
cout<<i+1<<" "<<d[i]<<" "<<f[i]<<endl;
}
}
int main()
{
int u,v,k;
cin>>n;
memset(m,0,sizeof(m));
for(int i=0;i<n;i++)
{
cin>>u>>v;
u--;
for(int j=0;j<v;j++)
{
cin>>k;
k--;
m[u][k]=1;
}
}
dfs();
return 0;
}