用栈的方法实现深度搜索
#include<iostream>
#include<stdio.h>
#include<stack>
#define N 100
int n;
int tt;
int m[N][N];//用二维数组存图
int nt[N],color[N],d[N],f[N];
static const int WHITE=0;
static const int GRAY=1;
static const int BLACK=2;
using namespace std;
int next(int u)
{
for(int v = nt[u];v<n;v++)
{
// cout<<v;
nt[u]=v+1;//下一次关于该点的搜寻是从V+1开始
if (m[u][v])return v;
}
return -1;
}
void dfs_visit(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())
{
// cout<<2;
int u=S.top();
int v=next(u);
cout<<v<<endl;
if(v!=-1)
{
//cout<<3;
if(color[v]==WHITE)
{
color[v]=GRAY;
d[v] = ++tt;
S.push(v);
}
}//记着这里可以先留一命,要是子部分什么都没有才需要pop
else
{
// cout<<4;
S.pop();
color[u] = BLACK;
f[u]= ++tt;//终止时间戳
}
}
}
void dfs()
{
//初始化
for( int i=0;i<=n;i++){
color[i] = WHITE;
nt[i] = 0; //nt[i]=x;表示的是第i个数的下一个数是x
}
tt=0; //时间戳赋值为0
//找到未访问的点进行dfs
for(int u=0;u<n;u++)
{
// cout<<1;
if(color[u] == WHITE) dfs_visit(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+1;i++)
{
for(int j=0;j<n+1;j++)
{
m[i][j]=0;
}
}
for(int i=0;i<n;i++)
{
cin>>u>>k;
for(int j=0;j<k;j++)
{
cin>>v;
v--;
m[u-1][v]=1;
}
}
dfs();
return 0;
}
参考资料
《程序设计》