zoukankan      html  css  js  c++  java
  • 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;
    }
    

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

  • 相关阅读:
    Sliding Window
    方程的解数
    [JLOI2011]不重复数字
    A−B数对
    2007年分区联赛提高组之一 统计数字
    Magic Squares 魔板 (BFS+HASH)
    集合(normal)
    Place the Robots
    LoadRunner监控Linux
    CentOS6.3(64位)下安装Oracle11gR2(64)服务器
  • 原文地址:https://www.cnblogs.com/wenwangt/p/4925408.html
Copyright © 2011-2022 走看看