用栈来实现DFS



#include <iostream>

#include <stack>


using namespace std;


static const int N=100;
static const int WHITE=0;
static const int GRAY=1;
static const int BLACK=2;
int n,M[N][N];
int d[N],f[N],color[N],time;


int next(int u) //主要是为了遍历结点u的所有邻接结点
{
    for(int v=0;v<n;v++)
    {
        if(M[u][v]&&color[v]==WHITE) return v;
    }
    return -1;
}


void dfs_visit(int r)
{


    stack<int> S;
    S.push(r);
    color[r]=GRAY;
    d[r]=++time;


    while(!S.empty())
    {
        int u=S.top();
        int v=next(u);
        if(v!=-1)
        {
            if(color[v]==WHITE)//结点未被访问呢
            {
                color[v]=GRAY;//表示正在访问当前结点
                d[v]=++time;//当前结点的初始访问时间加1
                S.push(v);//v结点入栈
            }
        }
        else
        {
            S.pop();//弹出栈当中的嘴上层结点
            color[u]=BLACK;
            f[u]=++time;
        }
    }
}


void dfs()
{
    for(int i=0;i<n;i++)
    {
        color[i]=WHITE;//表示该顶点还没有被访问
    }
    time=0;


    for(int u=0;u<n;u++)
    {
        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;i++)
    for(int j=0;j<n;j++)
   {
       M[i][j]=0;
   }


   for(int i=0;i<n;i++)
   {
       cin>>u>>k;
       for(int j=0;j<k;j++)
       {
           cin>>v;
           M[u-1][v-1]=1;
       }
   }


   dfs();
   return 0;
}




猜你喜欢

转载自blog.csdn.net/chengsilin666/article/details/79188730