poj1308 并查集
比较恶心
1: 0 0 空树是一棵树 2: 1 1 0 0 不是树 3: 1 2 1 2 0 0 不是树... 4: 1 2 2 3 4 5 不是树 森林不算是树 5: 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 错 6: 1 2 2 1 0 0 也是错误的
#include<stdio.h> #include<string.h> int pa[1010],a[1010],b[1010],n,in[1010],map[1010],hash[1010]; void init() { for(int i=0;i<=n;i++) { pa[i]=i; } } int find(int x) { if(x!=pa[x]) pa[x]=find(pa[x]); return pa[x]; } int main() { int i,j,flag,ff=0; while(scanf("%d%d",&a[0],&b[0])!=EOF) { j=0; memset(hash,0,sizeof(hash)); memset(map,0,sizeof(map)); memset(in,0,sizeof(in)); if(!hash[a[0]]) map[j++]=a[0]; if(!hash[b[0]]) map[j++]=b[0]; if(a[0]==0&&b[0]==0) { printf("Case %d is a tree.\n",++ff); continue; } n=0; flag=1; if(a[0]<0&&b[0]<0) break; in[a[0]]++,in[b[0]]++; if(a[0] > n) n = a[0]; if(b[0] > n) n = b[0]; i=0; while(1) { i++; scanf("%d %d",&a[i],&b[i]); if(a[i]==0&&b[i]==0) break; if(!hash[a[i]]) { hash[a[i]]=1; map[j++]=a[i]; } if(!hash[b[i]]) { map[j++]=b[i]; hash[b[i]]=1; } if(a[i] > n) n = a[i]; if(b[i] > n) n = b[i]; } int num=j; //for(j=0;j<num;j++) // printf("%d ",map[j]); //printf("\n"); int len=i; init(); for(i=0;i<len;i++) { int x,y; x=find(a[i]); y=find(b[i]); if(x!=y) { pa[x]=y; } else flag=0; } int ans=0; for(i=0;i<num;i++) { if(pa[map[i]]==map[i]) { ans++; } } if(ans>1) flag=0; if(flag) printf("Case %d is a tree.\n",++ff); else printf("Case %d is not a tree.\n",++ff); } }