kahn算法:
1. 在有向图中选一个入度为零的点,并输出
2. 从图中删除所有与该点相关的边
3. 重复上述两步,直至所有顶点输出,或者当前图中不存在无前驱的顶点为止,后者代表我们的有向图是有环的,因此,也可以通过拓扑排序来判断一个图是否有环。
void kahn() { stack<int> s; int r[6]; //记录每个点的入度 for(int i=0;i<6;i++){ r[i]=0; } //统计每个点的入度 int num=0; for(int i=0;i<6;i++){ num=0; for(int j=0;j<6;j++){ if(a[j][i] == 1) num++; } r[i]=num; } //把入度为零的入栈 for(int i=0;i<6;i++){ if(r[i]==0) s.push(i); } //count用于计算输出点的个数 int count=0; while(!s.empty()){ int x=s.top(); s.pop(); cout<<x<<endl; for(int i=0;i<6;i++){ if(a[x][i] == 1){ r[i]--; if(r[i]==0) s.push(i); } } count++; } if(count == 6) cout<<"此图无环"<<endl; else cout<<"此图有环"<<endl; }
深度优先搜索:
void DFS(int u) { visit[u] = true; for(int i=0;i<6;i++){ if(a[u][i]==1 && visit[i]==false){ DFS(i); } } // 每次在递归结束时入栈 // 即当前顶点没有指向其他顶点的边了,也就是一条路径的最后一个顶点 s.push(u); }