hdu 1325 Is It A Tree? 并查集

来源:互联网 发布:零售行业有哪些数据 编辑:程序博客网 时间:2024/06/06 08:31


题目:点击打开链接

思路:利用并查集 判断给出的是否为一棵树。两个数组,vis[],father[],

利用vis[]判断是否出现过 ,(1)i出现过并且father[i]!=i时就能说明i的入度>1,不满足树的要求了;(2)根节点的个数如果>1也说明不是棵树 只要判断这两点就好。

code:

#include<iostream>#include<algorithm>#include<stdio.h>using namespace std;const int N=100000;int father[N],flag;int vis[N];void init(){    for(int i=0;i<100000;i++)    {        father[i]=i;        vis[i]=0;    }    flag=0;}int findd(int n){    if(n!=father[n])    return findd(father[n]);    return father[n];}int main(){   // freopen("i.txt","r",stdin);    int i,j,tt=0,a,b;    init();    while(scanf("%d%d",&a,&b)!=EOF&&a>=0&& b>=0)    {       if(flag==1 && a!=0 && b!=0)        continue;       if(a==0 && b==0)       {           int sum=0;           for(i=0;i<100000;i++)           {               if(i==findd(i) && vis[i])//判断根节点的个数                sum++;           }           if(sum>1)            flag=1;           tt++;           if(!flag)            printf("Case %d is a tree.\n",tt);           else            printf("Case %d is not a tree.\n",tt);            init();           continue;       }       if(b!=father[b])//相当于判断入度,当i!=father[i]时 它的入度就>=1了;        flag=1;       else       {           int aa=findd(a);           father[b]=aa;           vis[a]=vis[b]=1;       }    }    return 0;}

0 0
原创粉丝点击