1 深度優先方法ios
首先須要更改矩陣初始化函數init_graph()算法
而後咱們須要初始化vist標記數組數組
深度優先訪問圖,而後根據是否存在back edge判斷是否存在環路函數
算法以下:oop
#include <iostream> using namespace std; #define MAX_VERTEX_NUM 128 enum color{WHITE, GRAY = 1, BLACK}; bool M[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int colour[MAX_VERTEX_NUM]; int dfsNum[MAX_VERTEX_NUM], num; int indegree[MAX_VERTEX_NUM]; int vexnum, edgenum; bool loop; 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; //initialize in vertex degree indegree[i - 1]++; indegree[j - 1]++; edgenum--; } } void dfs(int u, int p){ colour[u] = GRAY; dfsNum[u] = num++; cout<<"old relation:"<<endl; cout<<"child: "<<u + 1<<" parent :"<<p + 1<<endl; for( int v = 0; v < vexnum; v++){ if(M[u][v] && v != p){ if(colour[v] == WHITE){ cout<<"new relation:"<<endl; cout<<"parent "<<u + 1<<"(color: "<<colour[u]<<")" <<"and child "<<v + 1<<"(color: "<<colour[v]<<")"<<endl; dfs(v, u); cout<<"parent "<<u + 1<<"(color: "<<colour[u]<<")" <<"and child "<<v + 1<<"(color: "<<colour[v]<<")"<<endl; } else if(colour[v] == GRAY){ cout<<"back edge between"<<u + 1<<" and "<<v + 1<<endl; loop = true; // break; } else if(colour[v] == BLACK){ cout<<"cross edge between"<<u + 1<<" and"<<v + 1<<endl;; loop = true; // break; } } } 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(); cout<<endl; if(loop) cout<<"There is loop in graph!"<<endl; int ch; cin>>ch; return 0; }
版權聲明:本文爲博主原創文章,未經博主容許不得轉載。spa