poj 1308 并查集(判断一组点对是否能够组成树)
来源:互联网 发布:最喜欢的一句话知乎 编辑:程序博客网 时间:2024/06/08 14:44
题意:给定一组有序点对,如(a,b)表示有边从a指向b。问这组点对是否能够形成树。
思路:如果输入有(a,b),如果b没有其他前驱而且a不为b的前驱(或者a与b相等),则合并a和b,注意合并方向。对所有出现的点进行标记,最后通过father[i] = i的个数判断是树还是森林。
#include <stdio.h>#include <string.h>#define N 105int T=1,a,b;int father[N],num[N];void init(){int i;memset(num,0,sizeof(num));for(i = 1;i<N;i++)father[i] = i;}int find(x){if(father[x] == x)return x;return father[x] = find(father[x]);}void merge(int x,int y){father[y] = find(x);}int main(){freopen("a.txt","r",stdin);while(scanf("%d %d",&a,&b) && !(a==-1&&b==-1)){int flag = 1,i,j,sum;if(!a && !b){printf("Case %d is a tree.\n",T++);continue;}init();do{num[b] = num[a] = 1;if(find(a)!=find(b) && father[b] == b)merge(a,b);elseflag = 0;}while(scanf("%d %d",&a,&b) &&a&&b);if(flag)for(i = 1,sum=0;flag&&i<N;i++){if(num[i] && father[i]==i)sum++;if(sum > 1)flag=0;}if(!sum)flag = 0;if(flag)printf("Case %d is a tree.\n",T++);elseprintf("Case %d is not a tree.\n",T++);}return 0;}
0 0
- poj 1308 并查集(判断一组点对是否能够组成树)
- 并查集-用并查集判断图中是否有环(能够应用到kruskal的最小生成树)
- poj 1308 并查集判断“树”
- POJ 1308(并查集判断树)
- 【并查集】判断是否为树
- 【并查集】判断是否为树
- hdu 1272 小希的迷宫 并查集->如何判断是否组成一串 即一棵树
- 判断三条边是否能够组成三角形
- [POJ 1308]Is It A Tree?(并查集判断图是否为一棵有根树)
- poj 2513 欧拉回路+并查集判断是否联通+Trie树
- HDU 1272 HDU 1308&&POJ 1308(树的判断)(并查集)
- POJ-1308-Is It A Tree?(并查集 判断树)
- 小希的迷宫(并查集,未知点,限定一个老大,判断是否有圈)
- 用并查集判断是否为树
- zoj1268-简单并查集(判断是否为一颗树)
- HUD 1272 (并查集判断是否有环)
- GOJ1446 并查集判断逻辑错误(是否说谎)
- (用树结构支持并查集8.2.2)POJ 1703 Find them, Catch them(并查集的简单使用: 判断两个元素是否属于同一集合)
- 3.1.4、ObjectARX程序的初始化
- 10g RAC 使用service实现taf
- js判断undefined类型
- string
- HDU2674 N!Again 【数学】
- poj 1308 并查集(判断一组点对是否能够组成树)
- HDU 1711 Number Sequence KMP题解
- 在eclipse下直接部署maven工程缺少jar包问题
- ios--视图控制器视图的装载
- UVa 340 Master-Mind Hints
- sort函数用法详解
- JavaScript学习二 常言的方法整理
- 包含最小元素的栈
- hdu 1754 I Hate It