没啥说的,记得特判空树
AC代码:
#include <iostream>
#include <cstring>
#include <set>
using namespace std;
const int maxn=1000005;
int f[maxn],vis[maxn];
void init()
{
for(int i=1;i<maxn;i++) f[i]=i;
memset(vis,0,sizeof(vis));
}
int find(int k)
{
if(k==f[k]) return k;
return f[k]=find(f[k]);
}
void join(int k1,int k2)
{
f[find(k2)]=find(k1);
}
set<int> ss;
int main()
{
int tot=0;
while(true){
ss.clear();
int num1,num2;cin>>num1>>num2;ss.insert(num1),ss.insert(num2);
if(num1==-1&&num2==-1) break;
init();++tot;
if(!num1&&!num2){
cout<<"Case "<<tot<<" is a tree.\n";
continue;
}
int join_cnt=0;
vis[num2]=1;
join(num1,num2); join_cnt++;
int flag=1;
while(true){
cin>>num1>>num2;
if(!num1&&!num2){
if(!flag||(join_cnt+1!=ss.size())){
cout<<"Case "<<tot<<" is not a tree.\n";
break;
}
cout<<"Case "<<tot<<" is a tree.\n";
break;
}
ss.insert(num1),ss.insert(num2);
if(find(num1)==find(num2)||vis[num2]){
flag=0;
}
else{
join(num1,num2); join_cnt++;
vis[num2]=1;
}
}
}
}