• DFS(White-Gray-Black)


    参考《数据结构与算法》

    本书在复杂深度优先遍历图时,采用三种颜色标记图中节点

    1 white 表示未访问

    2 gray 表示已经正在访问,其相邻节点

    3 black 表示该节点所有的相邻节点都已经深度优先访问结束

     算法可以判断图中是否存在环。

    算法如下:

    #include <iostream>
    using namespace std;
    
    #define MAX_VERTEX_NUM 128
    enum color{WHITE, GRAY, BLACK};
    bool M[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
    int colour[MAX_VERTEX_NUM];
    int dfsNum[MAX_VERTEX_NUM], num;
    int vexnum, edgenum;
    
    void init_graph(){
        cout<<"enter vertex number:"<<endl;
        cin>>vexnum;
        cout<<"enter edge number:"<<endl;
        cin>>edgenum;
    
        int i, j;
        while(edgenum){
            cout<<"add new edge:"<<endl;
            cin>>i>>j;
            M[i - 1][j - 1] = true;
            edgenum--;
        }
    }
    
    void dfs(int u, int p){
        colour[u] = GRAY;
        dfsNum[u] = num++;
        for( int v = 0; v < vexnum; v++){
            if(M[u][v] && v != p){
                if(colour[v] == WHITE) dfs(v, u);
                else if(colour[v] == GRAY)
                    cout<<"back edge between"<<u<<" and"<<v<<endl;
                else cout<<"cross edge between"<<u<<" and"<<v<<endl;;
            }
        }
        colour[u] = BLACK;
    }
    
    void print_dfs_num(){
        for(int v = 0; v < vexnum; v++)
            cout<<dfsNum[v]<<" ";
    }
    
    
    
    int main()
    {
        init_graph();
        dfs(0, -1);
        print_dfs_num();
    
        int ch;
        cin>>ch;
        return 0;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    HUST-1350 Trie
    hihocoder-第六十一周 Combination Lock
    hihocoder-1196 : 高斯消元·二
    hihocoder-1195 : 高斯消元·一
    SPOJ
    HDU-5074
    UVALive
    POJ-2195
    UVALive
    POJ-1556
  • 原文地址:https://www.cnblogs.com/wenwangt/p/4925408.html
Copyright © 2020-2023  润新知