博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2545 并查集
阅读量:5155 次
发布时间:2019-06-13

本文共 1749 字,大约阅读时间需要 5 分钟。

题目描述:给定一个无向图,判断这个图是否满足任意两点之间有且仅有一条通路。

思路:并查集,若a和b之间有一条边且处于不同的集合中,则将a和b所在集合合并;若a和b本就在同一集合中(有一条通路),则加上这条a到b便有不止一条通路。另外还需要判断一下是否所有的点最后都能在一个集合中,即根的数量是否等于1.(其实说白了就是判断该图是不是一棵树)

注意:0 0的情况应该输出Yes(空树)

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 const int N = 100007; 7 int f[N]; 8 bool mark[N]; 9 10 void init()11 {12 for ( int i = 1; i < N; i++ )13 {14 mark[i] = false;15 f[i] = i;16 }17 }18 19 int find_f( int x )20 {21 if ( f[x] != x ) f[x] = find_f(f[x]);22 return f[x];23 }24 25 void union_set( int x, int y )26 {27 //f[x] = y居然会栈溢出28 f[y] = x;29 }30 31 int main ()32 {33 int a, b;34 while ( 1 )35 {36 scanf("%d%d", &a, &b);37 if ( a == -1 && b == -1 ) break;38 if ( a == 0 && b == 0 ) 39 {40 printf("Yes\n");41 continue;42 }43 init();44 mark[a] = mark[b] = true;45 union_set( a, b );46 bool flag = true;47 while ( 1 )48 {49 scanf("%d%d", &a, &b);50 if ( a == 0 && b == 0 ) break;51 if ( !flag ) continue;52 mark[a] = mark[b] = true;53 a = find_f(a), b = find_f(b);54 if ( a == b ) flag = false;55 else union_set( a, b );56 }57 if ( !flag )58 {59 printf("No\n");60 continue;61 }62 int cnt = 0;63 for ( int i = 1; i < N; i++ )64 {65 if ( mark[i] && f[i] == i ) cnt++;66 }67 if ( cnt == 1 ) printf("Yes\n");68 else printf("No\n");69 }70 return 0;71 }

 

转载于:https://www.cnblogs.com/huoxiayu/p/4391167.html

你可能感兴趣的文章
开源TinyXML 最简单的新手教程
查看>>
对Unity3d C#手动处理异常产生
查看>>
软件安全性能測试(转载)
查看>>
jQuery取得select选中的值
查看>>
html5新特性
查看>>
server2003 IIS6.0 网站不可用
查看>>
iOS检测QQ是否安装
查看>>
前端工程师需要掌握的技能
查看>>
数据结构学习之栈
查看>>
18. 爱吃皮蛋的小明(斐波那契数列)
查看>>
dos
查看>>
Bitmap对图像的处理
查看>>
[FZYZOJ 1073] Password
查看>>
定时器之Timer
查看>>
mysql如何选择合适的引擎
查看>>
图层控制
查看>>
javascript中apply、call和bind的区别
查看>>
javascript中的var i = {};是什么意思
查看>>
搞dedecms站 找后台的一些经验[转]
查看>>
CentOS 编译 Nginx 服务
查看>>