首页 > 其他 > 详细

dataStructure @ Check if a directed graph has cycles

时间:2015-10-23 11:57:12      阅读:118      评论:0      收藏:0      [点我收藏+]
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<limits>
 5 #include<vector>
 6 using namespace std;
 7 const int maxn = 10;
 8 struct edge{
 9     int to, cost;
10     edge(int t){
11         this->to = t; this->cost = 0;
12     }
13 };
14 void addEdge(vector<edge> &edgelist, vector<vector<int> > &G, int from, int to){
15     edgelist.push_back(edge(to));
16     G[from].push_back(edgelist.size()-1);
17 }
18 void addDoubleEdge(vector<edge> &edgelist, vector<vector<int> > &G, int from, int to){
19     addEdge(edgelist,G,from,to);
20     addEdge(edgelist,G,to,from);
21 }
22 bool isCyclic(vector<edge> edgelist, vector<vector<int> > G,vector<bool> vis, vector<bool> RecStack, int v){
23     for(int i=0;i<G[v].size();++i){
24         edge e = edgelist[G[v][i]];
25         if(RecStack[e.to]) return true;
26         if(!vis[e.to]){
27             vis[e.to] = true; RecStack[e.to] = true;
28             if(isCyclic(edgelist,G,vis,RecStack,e.to)) return true;
29             RecStack[e.to] = false;
30         }
31     }
32     return false;
33 }
34 void buildMap(vector<edge> &edgelist, vector<vector<int> > &G){
35     addEdge(edgelist,G,0,1);
36     addEdge(edgelist,G,0,2);
37     addEdge(edgelist,G,2,0);
38     addEdge(edgelist,G,1,2);
39     addEdge(edgelist,G,2,3);
40     addEdge(edgelist,G,3,3);
41 }
42 int main(){
43     vector<edge> edgelist;
44     vector<vector<int> > G(maxn);
45     vector<bool> vis(maxn);
46     vector<bool> RecStack(maxn);
47     
48     buildMap(edgelist,G);
49     
50     for(int i=0;i<vis.size();++i) vis[i]=false;
51     for(int i=0;i<RecStack.size();++i) RecStack[i]=false;
52     
53     for(int i=0;i<G.size();++i){
54         if(!vis[i]){
55             vis[i] = true; RecStack[i] = true;
56             if(isCyclic(edgelist,G,vis,RecStack,i)){
57                 cout<<i<<" starts a cycle"<<endl; 
58             }
59             RecStack[i] = false;
60         }
61     }
62     
63     return 0;
64 }

 

dataStructure @ Check if a directed graph has cycles

原文:http://www.cnblogs.com/fu11211129/p/4903833.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!