算法系列之图--探查环

摘要:
算法系列之图--探查环==分割==DFS可以被用来探查图中环的存在。仅有当一个图中存在‘回边’(backedge)时可以判定图中存在环。’回边‘是一条边,该边从一个结点到该结点或者到达该结点在DFS中的祖先。下图有三条‘回边’,也就有三个环代码例子:1#include<iostream>2#include<limits.h>3#include<list>4usingnamespacestd;56classGraph{7intv;//结点数8list<int>*adj;//邻接表9boolisCyclicUtil(intv,boolvisited[],bool*stack);10public:11Graph(intv);12voidaddEdge(intu,intv);13boolisCyclic();14};1516Graph::Graph(intv){17this->v=v;18this->adj=newlist<int>[v];19}2021voidGraph::addEdge(intu,intv){22adj[u].push_back(v);23}2425boolGraph::isCyclicUtil(intv,boolvisited[],boolresStack[]){26if(visited[v]==false){27cout<<v<<"";28visited[v]=true;29resStack[v]=true;30list<int>::iteratoriter=adj[v].begin();31for(;iter!=adj[v].end();iter++){32if(!visited[*iter]&&isCyclicUtil(*iter,visited,resStack))33returntrue;34elseif(resStack[*iter])35returntrue;36}37}38resStack[v]=false;39returnfalse;40}4142boolGraph::isCyclic(){43bool*visited=newbool[v];44bool*resStack=newbool[v];45for(inti=0;i<v;i++){46visited[i]=false;47resStack[i]=false;48}49for(inti=0;i<v;i++)50if(isCyclicUtil(i,visited,resStack))51returntrue;52returnfalse;53}5455intmain()56{57Graphg=Graph(4);58g.addEdge(2,0);59g.addEdge(2,3);60g.addEdge(0,1);61g.addEdge(0,2);62g.addEdge(3,3);63g.addEdge(1,2);6465if(g.isCyclic())66cout<<"Graphhasacycle"<<endl;67else68cout<<"Graphhasnocycle"<<endl;6970return0;71}运行结果为:代码参考:http://www.geeksforgeeks.org/detect-cycle-in-a-graph/

DFS可以被用来探查图中环的存在。仅有当一个图中存在‘回边’(back edge)时可以判定图中存在环。’回边‘是一条边,该边从一个结点到该结点或者到达该结点在DFS中的祖先。

下图有三条‘回边’,也就有三个环

算法系列之图--探查环第1张

代码例子:

1 #include <iostream>
2 #include <limits.h>
3 #include <list>
4 using namespacestd;
5 
6 classGraph{
7     int v;//结点数
8     list<int> *adj;//邻接表
9     bool isCyclicUtil(int v,bool visited[],bool *stack);
10 public:
11     Graph(intv);
12     void addEdge(int u,intv);
13     boolisCyclic();
14 };
15 
16 Graph::Graph(intv){
17     this->v =v;
18     this->adj = new list<int>[v];
19 }
20 
21 void Graph::addEdge(int u,intv){
22 adj[u].push_back(v);
23 }
24 
25 bool Graph::isCyclicUtil(int v,bool visited[],boolresStack[]){
26     if (visited[v] == false){
27         cout<<v<<" ";
28         visited[v] = true;
29         resStack[v] = true;
30         list<int>::iterator iter =adj[v].begin();
31         for (;iter != adj[v].end();iter++){
32             if (!visited[*iter] && isCyclicUtil(*iter,visited,resStack))
33                 return true;
34             else if (resStack[*iter])
35                 return true;
36 }
37 }
38     resStack[v] = false;
39     return false;
40 }
41 
42 boolGraph::isCyclic(){
43     bool *visited = new bool[v];
44     bool *resStack = new bool[v];
45     for (int i=0;i<v;i++){
46         visited[i] = false;
47         resStack[i] = false;
48 }
49     for (int i=0;i<v;i++)
50         if(isCyclicUtil(i,visited,resStack))
51             return true;
52     return false;
53 }
54 
55 intmain()
56 {
57     Graph g = Graph(4);
58     g.addEdge(2,0);
59     g.addEdge(2,3);
60     g.addEdge(0,1);
61     g.addEdge(0,2);
62     g.addEdge(3,3);
63     g.addEdge(1,2);
64 
65     if(g.isCyclic())
66         cout<<"Graph has a cycle"<<endl;
67     else
68         cout<<"Graph has no cycle"<<endl;
69 
70     return 0;
71 }

运行结果为:

算法系列之图--探查环第2张

代码参考:http://www.geeksforgeeks.org/detect-cycle-in-a-graph/

免责声明:文章转载自《算法系列之图--探查环》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android 返回键的处理SVG研究之路(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

如何在linux下安装idea

[通过正式安装包安装]http://www.jetbrains.com/在官方网站上下载相应版本。终极旗舰社区版本,将其解压缩到本地对应目录,然后执行/idea.sh命令。安装后,可以在启动程序中找到创意图标。...

Systemd简介与使用

Systemd在并行启动中采用了比Upstart更激进的方案。图2显示了systemd的并行启动模式。它允许所有配置的服务同时启动。事实上,大多数使用systemd的现代发行版都与此类似。系统通过配置这些单元来切换和管理服务。...

uniapp 实现动态切换全局主题色

要求:要在开发的应用程序中切换主题颜色,如果只需要一种主题颜色,但不需要切换,则可以使用uniappSCSS文件文档思想:预先在公共css中定义所需的主题颜色。这里只是一个定义两种颜色的参考文档的示例,可以从中获得想法。您可以使用css属性选择器动态设置数据xx以动态更改主题颜色。最初,您希望将一个变量直接混合到mixin中,以实现主题颜色的全局控制,忽略了...

AVUE 下拉 select 获取选中项的文本

底层应该不支持,其它方式应该可以,到时候看看黎大神给的方案。...

Axure RP 8 注册码 更新了

升级8.1.0.3381后,您需要使用以下注册码http://www.raedme.cn/keys/316.htmlLicense:zdfansKey:fZw2VoYzXakllUuLVdTH13QYWnjD6NZrxgubQkaRyxD5+HNMqdr+WZKkaa6IoE5N许可证:zd423Key:LrZoHMetrL7OK8XOVWgvTFn+XOR...

VS调试异常问题解决(一)

VisualStudio必须是"以管理员身份运行",即鼠标右键"以管理员身份运行",不是指你当前登录的账户是不是Administrator的问题。参考:VS调试时断点无法进入或命中的原因及解决方法当前不会命中断点,还没有为该文档加载任何符号参考:VS2017调试代码显示“当前无法命中断点,还没有为该文档加载任何符号”注:在mvc中视图cshtml中,如果代码...