HDU 1325 Is It A Tree?(并查集)
2012-08-29 16:52
344 查看
题意:给你一些有向边,问是否能构成一棵树。。
思路:1、把树的边当成是无向边,则所有的点属于同一个集合,使用并查集
2、所有点至多只能有一个入度。
3、根节点只能有一个
4、特判0,0,
思路:1、把树的边当成是无向边,则所有的点属于同一个集合,使用并查集
2、所有点至多只能有一个入度。
3、根节点只能有一个
4、特判0,0,
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> using namespace std; const int N = 1009; int fa ; bool visit ; int finfa(int k) { if(k==fa[k]) return k; return fa[k] = finfa(fa[k]); } void un(int a,int b) { fa[finfa(a)] = fa[finfa(b)]; } int in ,root; int main() { freopen("in.txt","r",stdin); int a,b,T = 1; while(scanf("%d%d",&a,&b)&&(a>=0||b>=0)) { bool fig = false; if(a==0&&b==0) { printf("Case %d is a tree.\n",T++); continue; } memset(visit,false,sizeof(visit)); memset(in,0,sizeof(in));root = 0 ; for(int i=0;i<N;i++) fa[i] = i; un(a,b);visit[a] = visit[b] = true; in[b]++; while(~scanf("%d%d",&a,&b)&&(a+b)) { un(a,b); visit[a] = visit[b] = true; in[b]++; // cout<<in[b]<<" LLL"<<endl; } int rt = -1; for(int i=0;i<N;i++) if(visit[i]) { //cout<<i<<endl; if(!in[i]) root++; if(in[i]>1) fig = true; if(rt==-1) rt = finfa(i); else if(rt!=finfa(i)) fig = true; } if(root!=1||fig) { printf("Case %d is not a tree.\n",T++); } else { printf("Case %d is a tree.\n",T++); } } return 0; }
相关文章推荐
- hdu 1325 Is It A Tree? 并查集
- 【并查集】HDU 1325 Is It A Tree?
- HDU 1325 Is It A Tree? POJ 1308 Is It A Tree? (并查集+入度,判断一个有向图是树)
- hdu 1325 Is It A Tree?(并查集)
- poj 1308 &&HDU 1325 Is It A Tree?(并查集、树的定义)
- 【并查集】HDU 1325 Is It A Tree?
- hdu 1325/poj 1308 Is It A Tree? 并查集
- 【并查集】HDU 1325 Is It A Tree?
- hdu1325 Is It A Tree?(有向图并查集)
- POJ 1308 && HDU 1325 Is It A Tree?(并查集)
- HDU 1325 Is It A Tree?(并查集)
- 【并查集】HDU 1325 Is It A Tree?
- hdu 1325 Is It A Tree?(并查集)
- hdu 1325 Is It A Tree?(并查集全都是坑)
- 【HDU】-1325-Is It A Tree?(并查集)
- HDU 1325 Is It A Tree 并查集+树的性质
- HDU 1325 Is It A Tree?(并查集)
- HDU-1325 Is It A Tree? ACM解题报告(恶心的并查集)
- HDU 1325 POJ 1308 Is It A Tree? (并查集)
- HDU 1325 Is It A Tree?(并查集或者树)