有向图判环
Posted liugl7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有向图判环相关的知识,希望对你有一定的参考价值。
有这样一道编程面试题,给一个有向图的邻接矩阵,判别它是否有环。
题目麻烦在给的邻接矩阵是以 ‘字符输入流’ 的形式给出的,所以将其处理成数字形式的是首先要做的工作。
得到邻接矩阵之后,进行拓扑排序即可。假如能完成拓扑排序那就无环,如果不能,那就是有环。
样例输入:
[[0, 1, 0], [0, 0, 1], [1, 0, 0]]
[[0, 0, 0, 1, 0], [1, 0, 0, 0, 0], [0, 0, 0, 1, 1], [0, 0, 0, 0, 0], [0, 1, 0, 0, 0]]
输出:(1代表有环,0代表无环)
1
0
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int main(int argc, char const *argv[]) 5 string str; 6 while(getline(cin, str) ) 7 vector<int> data; 8 for(int i=0; i<str.size(); i++) 9 if(str[i]==‘0‘ || str[i]==‘1‘) 10 data.push_back(str[i]-‘0‘); 11 12 13 14 int n = sqrt( data.size() ); //n是节点个数 15 vector<vector<int> > graph(n,vector<int>(n,0)); //邻接矩阵 16 17 for(int i=0; i<n; i++) 18 for(int j=0; j<n; j++) 19 graph[i][j] = data[n*i+j]; 20 21 22 23 vector<int> visited(n,0); //n是节点个数,从上面处理后得到 24 vector<int> indegree(n,0); //各个节点的入度 25 for(int i=0;i<n;i++) 26 for(int j=0;j<n;j++) 27 if(graph[i][j]==1) 28 indegree[j]++; 29 30 31 32 queue<int> q; 33 for(int i=0;i<n;i++) 34 if(indegree[i]==0) 35 q.push(i); 36 37 38 int now; 39 while(!q.empty()) 40 now = q.front(); 41 q.pop(); 42 visited[now] = 1; 43 for(int i=0;i<n;i++) 44 if(!visited[i] && graph[now][i]==1) 45 indegree[i]--; 46 if(indegree[i]==0) q.push(i); 47 48 49 50 51 bool sign = 0; 52 for(int i=0; i<n; i++) 53 if(!visited[i]) 54 sign = 1; 55 break; 56 57 58 59 cout<<sign<<endl; 60 61 62 return 0; 63
以上是关于有向图判环的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces1100 E. Andrew and Taxi(二分+有向图判环,拓扑序)
CodeForces 937D 936BSleepy Game 有向图判环,拆点,DFS