参考《数据结构与算法》
本书在复杂深度优先遍历图时,采用三种颜色标记图中节点
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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。