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;
}

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

posted @ 2014-05-18 15:11  快乐的小土狗  阅读(262)  评论(0编辑  收藏  举报