标签:
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<cstdlib> #include<cstring> #include<algorithm> using namespace std; const int maxn=99999; int a[maxn];//并查集 int rank[maxn];//树高 void init() { for(int i=0;i<maxn;i++)a[i]=i,rank[i]=0; } int find(int x) { if(x==a[x])return x; return a[x]=find(a[x]); } void unit(int x,int y) { x=find(x); y=find(y); if(x==y)return ; if(rank[x]<rank[y]) a[x]=y; else { a[y]=x; if(rank[x]==rank[y])rank[x]++; } } bool same(int x,int y) { return find(x)==find(y); } bool vis[maxn]; int main() { int n,m,i,j,k,t; int x,y;int cas=1; while(true) { init(); int ok=0;//判断是否存在环 memset(vis,false,sizeof(vis)); while(cin>>x>>y) { if(x==-1&&y==-1)return 0; if(!x&&!y)break; vis[x]=vis[y]=true; if(!same(x,y)) unit(x,y); else ok=1; } int sum=0; for(i=1;i<maxn;i++)if(vis[i]) { if(i==a[i])sum++;//判断是否存在孤立的节点 } if(ok||sum>1)printf("Case %d is not a tree.\n",cas++); else printf("Case %d is a tree.\n",cas++); } return 0; }
标签:
原文地址:http://blog.csdn.net/u013167299/article/details/44222213