HDOJ 1308.Is It A Tree?
来源:互联网 发布:加入淘宝30元消保要求 编辑:程序博客网 时间:2024/05/08 16:11
2015-07-15
问题简述:
给出一组节点关系,判断由这些节点组成的图是否为一颗树。
树只有一个根节点,每个节点只有一条边指向它,没有环。
原题链接:http://poj.org/problem?id=1308
解题思路:
使用并查集判断是否只有一个根节点是很简单的——让并查集种祖先的父亲是他自己即可方便计算其数量,一旦祖先数量超过一,它就不是树;
也可使用并查集判断图是否有环——当两个即将要链接的节点都有相同的祖先时,这就产生了一个环。
源代码:
/*OJ: POJID: foreverTASK: 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;}
0 0
- HDOJ 1308.Is It A Tree?
- Is It A Tree? -- HDOJ
- hdoj 1325 Is It A Tree?
- HDOJ 1325 Is It A Tree?
- HDOJ 1325 Is It A Tree?
- HDOJ 1325 Is It A Tree?
- hdoj 1325 Is It A Tree?
- HDOJ 1325 Is It A Tree? 杭电 ACM
- POJ-1308 & HDOJ-1325 Is It A Tree? 解题报告
- hdoj 1325 Is It A Tree? 【并查集】
- HDOJ 1325 Is It A Tree?(并查集)
- 并查集判树 hdoj 1325 Is it a tree?
- HDOJ 1325 Is It A Tree? (并查集)
- HDOJ 1325 Is It A Tree(并查集)
- Is It A Tree?
- Is it a tree?
- Is It A Tree?
- Is It A Tree?
- Android比较好的10个开源框架
- Laravel5 学习与使用(一)
- PHP-购物网站开发设计(一)
- PHP-购物网站开发设计(二)
- POJ 2442.Sequence
- HDOJ 1308.Is It A Tree?
- POJ 3784.Running Median
- 深入研究SimpleDateFormat
- 四种常见的 POST 提交数据方式
- SharePointAPP中不能使用JS创建txt文件?
- error code '1064' MySql中报错
- Objective-C中@property的所有属性详解
- MWPhotoBrowser图片加载失败
- 【leetcode c++】104 Maximum Depth of Binary Tree