poj1308(简单并查集)

题目链接:http://poj.org/problem?id=1308

题意:x, y 表示x 与 y连接,给出一波这样的数据,问这组数据能否构成树,即不能形成回路,不能有多个根节点;要注意可以是空树;

代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #define MAXN 1000000
 4 using namespace std;
 5 
 6 int pre[MAXN], flag;
 7 
 8 int find(int x){
 9     int r=x;
10     while(pre[r]!=r){
11         r=pre[r];
12     }
13     int i=x;
14     while(i!=r){
15         int gg=pre[i];
16         pre[i]=r;
17         i=gg;
18     }
19     return r;
20 }
21 
22 int jion(int x, int y){
23     int xx=find(x);
24     int yy=find(y);
25     if(xx!=yy){
26         pre[xx]=yy;
27     }else{
28         flag=0;
29     }
30 }
31 
32 int main(void){
33     int a, b, t=1;
34     while(scanf("%d%d", &a, &b)&&(a!=-1&&b!=-1)){
35         if(!a&&!b){
36             printf("Case %d is a tree.
", t++);
37         }else{
38             flag=1;
39             int Max=0, c[MAXN], d[MAXN], i=1;
40             Max=max(Max, max(a, b));
41             c[0]=a, d[0]=b;
42             int x, y;
43             while(scanf("%d%d", &x, &y)&&x&&y){
44                 c[i]=x;
45                 d[i]=y;
46                 Max=max(Max, max(x, y));
47                 i++;
48             }
49             for(int j=1; j<=Max; j++){
50                 pre[j]=j;
51             }
52             for(int j=0; j<i; j++){
53                 jion(c[j], d[j]);
54             }
55             int ans=0;
56             for(int j=0; j<i; j++){
57                 if(c[j]==pre[c[j]]){
58                     ans++;
59                 }else if(d[j]==pre[d[j]]){
60                     ans++;
61                 }
62             }
63             if(ans>1 || flag==0){
64                 printf("Case %d is not a tree.
", t++);
65             }else{
66                 printf("Case %d is a tree.
", t++);
67             }
68         }
69     }
70     return 0;
71 }
原文地址:https://www.cnblogs.com/geloutingyu/p/5998318.html