有这样一道编程面试题,给一个有向图的邻接矩阵,判别它是否有环。
题目麻烦在给的邻接矩阵是以 ‘字符输入流’ 的形式给出的,所以将其处理成数字形式的是首先要做的工作。
得到邻接矩阵之后,进行拓扑排序即可。假如能完成拓扑排序那就无环,如果不能,那就是有环。
样例输入:
[[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 }