标签:
Description
Input
Output
Sample Input
6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
Sample Output
Case 1 is a tree. Case 2 is a tree. Case 3 is not a tree.
解题思路:判断是否是树有三个条件:一、没有回路 二、只有一个根节点 三、除根外每个节点有且只有一条有向边指向它。(并查集)
代码如下:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define MAXN 1000002 int p[MAXN]; int find(int x) { return p[x]==x ? x :(p[x]=find(p[x])); } int main() { int a,b,tree_num,t=0,father_a,father_b,TF; while(~scanf("%d%d",&a,&b) && (a>=0||b>=0)) { tree_num=TF=1; if(a==0) { printf("Case %d is a tree.\n",++t); continue; } if(a==b) TF=0; else { memset(p,0,sizeof(p)); p[a]=p[b]=a; } while(~scanf("%d%d",&a,&b) && a!=0) { if(TF==0 ) continue; if(p[b]!=0) { father_b=find(b); if(b!=father_b) { TF=0; continue; } else { if(p[a]!=0) { p[b]=find(a); tree_num--; } else p[b]=p[a]=a; } } else { if(p[a]==0) { p[a]=p[b]=a; tree_num++; } else p[b]=find(a); } } printf("Case %d ",++t); if(TF==0) { printf("is not a tree.\n"); continue; } if(tree_num==1) printf("is a tree.\n"); else printf("is not a tree.\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/llfj/p/5696972.html