判断无向图是否有环
2016-05-14 10:46
477 查看
无向图:
1 并查集
首先我们把每个点看成独立的集合{0} ,{1}, {2}, 然后规定如果两个点之间有边相连,如果这两个点不属于同一个集合,那就将他们所属的结合合并,看边0-1,直接将这两个点代表的集合合并{0, 1}, 其中让1来当父节点, 看边1-2, 它们分别属于不同的集合,合并集合之后是{1, 2},让2来当父节点,依照这种逻辑关系,0的祖先节点就是2, 然后在看边0-2,他们属于一个集合,因为他们有着共同的祖先2, 这就说明0-2之间在没有0-2这条边之前已经连通了,如果在加上这条边的话那从0到2就有两条路径可达,就说明存在一个环了.
图只有树边和反向边,如果有反向边那么就有环,否则就是树或森林
1 并查集
首先我们把每个点看成独立的集合{0} ,{1}, {2}, 然后规定如果两个点之间有边相连,如果这两个点不属于同一个集合,那就将他们所属的结合合并,看边0-1,直接将这两个点代表的集合合并{0, 1}, 其中让1来当父节点, 看边1-2, 它们分别属于不同的集合,合并集合之后是{1, 2},让2来当父节点,依照这种逻辑关系,0的祖先节点就是2, 然后在看边0-2,他们属于一个集合,因为他们有着共同的祖先2, 这就说明0-2之间在没有0-2这条边之前已经连通了,如果在加上这条边的话那从0到2就有两条路径可达,就说明存在一个环了.
int main(){ int n,m,f1,f2; int pre[1000]; //每个点互相独立,自成一个集合,从1编号到1000的上级都是自己 for(i=1;i<=1000;++i){ pre[i]=i; } while(scanf("%d,%d",&m,&n)==2){ //m和n相连 f1=find(n); f2=find(m); if(f2==f1) //两点已经连通了,那么这条路有一个环 else unio(n,m); } return 0; }2 DFS
图只有树边和反向边,如果有反向边那么就有环,否则就是树或森林
bool dfs(int i,int pre)</span>{ visit[i]=true; for(int j=1;j<=v;j++) if(g[i][j]) { if(!visit[j]) return dfs(j,i); else if(j!=pre) //如果访问过,且不是其父节点,那么就构成环 return true; } }
相关文章推荐
- Docker学习 ----常用操作命令大全及例子[陆续更新中...]
- word2vec (一) 简介与训练过程概要
- 如何制作纯 ASCII 文本流程图
- Python安装模块出错(ImportError: No module named setuptools)解决方法
- Android小技巧
- 街区最短路径问题
- oracle数据库的静默(Quiesce)状态
- C++重载重写重定义
- 长微博图片制作(无水印)
- AVD Manager
- 在ASP.NET 2.0中操作数据之四十三:DataList和Repeater数据排序(二)
- IDEA Java/Scala混合项目maven打包
- JAVA-反射学习(3)
- 数组------和为定值的多个数
- c++开发ocx入门实践三--基于opencv的简易视频播发器ocx
- C++——中的虚函数(Virtual function)
- 三个作业题
- 十进制、二进制互转
- Codeforces Round #157 (Div. 1) B. Little Elephant and Elections 数位dp
- C++纯虚函数作为接口类举例