码迷,mamicode.com
首页 > 其他好文 > 详细

有向图判环

时间:2019-07-30 21:48:13      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:工作   判环   out   ack   graph   sqrt   visit   c++   queue   

有这样一道编程面试题,给一个有向图的邻接矩阵,判别它是否有环。

题目麻烦在给的邻接矩阵是以 ‘字符输入流’ 的形式给出的,所以将其处理成数字形式的是首先要做的工作。

得到邻接矩阵之后,进行拓扑排序即可。假如能完成拓扑排序那就无环,如果不能,那就是有环。

样例输入:

[[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 }

 

有向图判环

标签:工作   判环   out   ack   graph   sqrt   visit   c++   queue   

原文地址:https://www.cnblogs.com/liugl7/p/11272614.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!