HDOJ 1308.Is It A Tree?
2015-07-27 14:44
295 查看
2015-07-15
问题简述:
给出一组节点关系,判断由这些节点组成的图是否为一颗树。
树只有一个根节点,每个节点只有一条边指向它,没有环。
原题链接:http://poj.org/problem?id=1308
解题思路:
使用并查集判断是否只有一个根节点是很简单的——让并查集种祖先的父亲是他自己即可方便计算其数量,一旦祖先数量超过一,它就不是树;
也可使用并查集判断图是否有环——当两个即将要链接的节点都有相同的祖先时,这就产生了一个环。
源代码:
问题简述:
给出一组节点关系,判断由这些节点组成的图是否为一颗树。
树只有一个根节点,每个节点只有一条边指向它,没有环。
原题链接:http://poj.org/problem?id=1308
解题思路:
使用并查集判断是否只有一个根节点是很简单的——让并查集种祖先的父亲是他自己即可方便计算其数量,一旦祖先数量超过一,它就不是树;
也可使用并查集判断图是否有环——当两个即将要链接的节点都有相同的祖先时,这就产生了一个环。
源代码:
/* OJ: POJ ID: forever TASK: 1308.Is It A Tree? LANG: C++ NOTE: Find-Union */ #include <cstdio> const int MAX=10005; int father[MAX],sign[MAX],flag; int Find(int x) { if(father[x]==x) return x; else return Find(father[x]); } void Union(int x,int y) { x=Find(x); y=Find(y); if(x!=y) father[x]=y; else flag=0; } int main() { int a,b,k=1; while(scanf("%d %d",&a,&b)) { if(a==-1&&b==-1) break; if(a==0&&b==0) { printf("Case %d is a tree.\n",k++); continue; } flag=1; int m=0; for(int i=0;i<MAX;i++) { father[i]=i; sign[i]=0; } Union(a,b); sign[a]=sign[b]=1; while(scanf("%d %d",&a,&b)) { if(a==0&&b==0) break; if(a>m) m=a; if(b>m) m=b; Union(a,b); sign[a]=sign[b]=1; } int sum=0; for(int i=1;i<MAX;i++) { if(sign[i]&&father[i]==i) sum++; if(sum>1) { flag=0; break; } } if(flag) printf("Case %d is a tree.\n",k++); else printf("Case %d is not a tree.\n",k++); } return 0; }
相关文章推荐
- Objective-C中@property的所有属性详解
- 每天一道算法题(25)——字符串中连续出现次数最多的子串
- hdu 1203 I NEED A OFFER!(01背包)
- 每天一道算法题(25)——字符串中连续出现次数最多的子串
- 判断是否是在手机登陆
- ds.Merge 与 ds.Tables[0].Merge 的用法
- 微信公众号开发之微信模板消息
- 修改用户密码引来的一系列麻烦
- 3.7-磁盘格式化 mke2fs
- iOS自学---彩票App第一天
- 【leetcode c++】104 Maximum Depth of Binary Tree
- 浮点数转换成字符串函数
- error code '1064' MySql中报错
- Mongodb并发与锁机制
- 3.6-fdisk命令
- 深入研究SimpleDateFormat
- Spark Streaming 流计算优化记录(6)-GC优化与shuffle service
- 移动互联网时代,好程序员的标准是什么?
- gdb 调试利器
- 基本算法的快速理解