hdu1325 Is It A Tree?(并查集)
2015-05-27 12:59
246 查看
根据树的特点:
要注意的问题就是:0 0 是棵树
用结构体,分别记录标记、入度和根
然后就分别判断:
不要产生环的情况
不要入度大于1的情况
不要多根的情况
要注意的问题就是:0 0 是棵树
用结构体,分别记录标记、入度和根
然后就分别判断:
不要产生环的情况
不要入度大于1的情况
不要多根的情况
#include<stdio.h> const int max_num = 100000 + 10; typedef struct { int num,root,conn; }Node; Node node[max_num]; void init() { for(int i=0;i<max_num;i++){ node[i].conn=0; node[i].root=i; node[i].num=0; } } int find_root(int a){ if(node[a].root!=a) return node[a].root = find_root(node[a].root); return node[a].root; } void union_set(int a,int b){ a = find_root(a); b = find_root(b); if(a == b) return ; node[b].root = a; } int main() { int n,m; int i=1; bool flag = true; init(); while(scanf("%d%d",&n,&m)!=EOF&&n>=0&&m>=0){ if(!flag&&n!=0&&m!=0) continue; if(n==0&&m==0){ int root_num=0; for(int j=1;j<max_num;j++){ if(node[j].num && find_root(j)==j) root_num++; if(node[j].conn>1){ flag =false; break; } } if(root_num > 1) flag = false; if(flag) printf("Case %d is a tree.\n",i++); else printf("Case %d is not a tree.\n",i++); flag = true; init(); continue; } if(m!=n&&find_root(n)==find_root(m)) flag = false; else { node[m].num = 1; node .num = 1; node[m].conn++; union_set(n,m); } } return 0; }
相关文章推荐
- HDU1325:Is It A Tree?(并查集)
- 并查集 HDU1325-Is It A Tree?
- hdu1325 Is It A Tree? 判断是否为树 并查集
- [并查集] hdu1325 Is it a tree ?
- HDU1325 Is It A Tree? 并查集
- HDU 1325 Is It A Tree?(并查集)
- Is It A Tree?(并查集)
- poj Is It A Tree?(并查集)(连通无环图)
- hdu1325(Is it a tree)
- 【并查集】hdu 1325 Is It A Tree? 或 poj 1308 Is It A Tree?
- Hdu.1325.Is It A Tree?(并查集)
- Is It A Tree? 并查集
- HDU 1272小希的迷宫 1325Is It A Tree? 并查集确定图为树
- HDU 1325 Is It A Tree?(并查集或者树)
- POJ-1308-Is It A Tree?(并查集 判断树)
- HDU1325:Is It A Tree?
- hdu 1325 Is It A Tree?(并查集)
- poj Is It A Tree?(并查集)(连通无环图)
- POJ1308 Is It A Tree?(树,并查集)
- 【并查集】HDU 1325 Is It A Tree?