有向图判环

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

SDNU 1089.拓扑排序(拓扑判环小顶堆)

12.10测试总结

Codeforces 711 D. Directed Roads (DFS判环)

HDU 1317 XYZZY(floyd+bellman_ford判环)