POJ1308解题报告

POJ1308解题报告
         一道水题,但也有值得我们思考的地方:
                给定一打节点的联通关系,判断它们是否构成了一棵树。
        一棵树的涵义应该包含两点:
                ①无环。
                ②联通。
        起初我只注意到了第一点,所以WA了一次。。后来。。看了题解才知道原来树不一定是一棵。
代码:
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
inline void in(int &x){
char c=getchar();
bool flag=0;
while(c<'0'||c>'9'){
if(c=='-')flag=1;
c=getchar();
}
x=0;
while(c>47&&c<58){
x=x*10+c-'0';
c=getchar();
}
if(flag)x=-x;
}
int fa[1000000],list[1000000];
inline int find(int x){
return fa[x]!=fa[fa[x]]?fa[x]=find(fa[x]):fa[x];
}
int main(){
int a,b,t=0,i,tot;
bool flag,p[1000000];
in(a);
in(b);
while(a>-1){
memset(p,0,sizeof(p));
flag=1;
tot=0;
while(a){
if(!p[a]){
fa[a]=a;
list[tot++]=a;
p[a]=1;
}
if(!p[b]){
fa[b]=b;
list[tot++]=b;
p[b]=1;
}
if(find(a)==find(b)){
flag=0;
break;
}
fa[fa[a]]=fa[b];
in(a);
in(b);
}
while(a){
in(a);
in(b);
}
find(list[0]);
for(i=1;i<tot;++i)
if(find(list[i])!=fa[list[0]]){
flag=0;
break;
}
printf("Case %d is ",++t);
if(!flag)printf("not ");
printf("a tree.\n");
in(a);
in(b);
}
return 0;
}  

你可能感兴趣的:(并查集)