并查集 4104 这是一棵树吗

来源:互联网 发布:阿里云 sap hana 编辑:程序博客网 时间:2024/06/02 00:40
判断是不是树

输入:

每输入一对都为0的数时,表示一组数据输入完毕。每条边有一对正整数表示,第一个数为有向边的起始边,第二个数为有向边的终止点。一对负数的输入就表示输入的结束。

输出:

每组测试数据输出一行判断结果,若输入的图为树,则输出“Case k is a tree.”,否则输出“Case k is not a tree.”其中k表示每组数据的编号(编号从1开始)。

样例输入:

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

 

 

 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<cstdlib> 6 //int cmp(const void*a,const void*b) 7 //{ 8 //    return(*(int *)a)<(*(int *)b)?1:-1; 9 //}10 int f[1000000];11 int flag[1000000];12 int find(int x)13 {14     if(f[x]!=x)15     f[x]=find(f[x]);16     return f[x];17 }18 19 int join(int x,int y)20 {21     int a=find(x);22     int b=find(y);23     if(b!=y)24     return 1;25     if(a==b)26     return 1;27     else28     f[b]=a;29     return 0;30 }31 32 int main()33 {34     int a,b;35     int t=0,key=0,max=0,g=0,p=1;36     memset(flag,0,sizeof(flag));37     for(int i=1;i<=999999;i++)38     f[i]=i;39     while(1)40     {41         scanf("%d%d",&a,&b);42         if(a>max)43         max=a;44         if(b>max)45         max=b;46         if(a<=-1&&b<=-1)47         break;48         if(a==0&&b==0)49         {50             for(int i=1;i<=max;i++)51             {52                 if(flag[i]==1&&f[i]==i)53                 g++;54             }55             if(key>0||g>=2)56             printf("Case %d is not a tree.\n",p++);57             else58             printf("Case %d is a tree.\n",p++);59             t=0;key=0;max=0;g=0;60             memset(flag,0,sizeof(flag));61             for(int i=1;i<=999999;i++)62             f[i]=i;63         }64         else65         {66             flag[a]=1;67             flag[b]=1;68             key+=join(a,b);69         }70     }71 72     return 0;73 }
View Code