HDU 1325 Is It A Tree? (POJ 1308)

来源:互联网 发布:python的len函数 编辑:程序博客网 时间:2024/05/14 21:53

并查集问题。。。

这题以前做过……

以前做过……

做过……

过……


不过重做时候被吭得异常之爽……

在判断 vis[i]的时候。我记得标准C++是非0 即为真。

而我用C++ 提交的时候 if(vis[i]) 去直接给我WA了。

用G++ 就AC了。。。然后改成if(vis[i]==1) 交C++ 就AC了。


特瞄的我每次初始化都把 vis[i] 都赋值为 0 了。。都能出这种错?

求路过大神明示我的错误。


题意是判断是否是一棵树。

不能存在森林,用并查集合并,每个点的入度不能超过1.

比如 1 2 3 2 0 0 就不是一棵树。



#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int fa[10010];bool vis[10010];int in[10010];int father(int x){    if(fa[x]!=x)        fa[x]=father(fa[x]);    return fa[x];}void intt(){    for(int i=0;i<=10010;i++)        fa[i]=i,vis[i]=in[i]=0;}int main(){    intt();    int x,y;    bool flag=1;    int tmp=0;    int treecot=1;    while(scanf("%d%d",&x,&y))    {        if(x<0&&y<0)return 0;        tmp=max(tmp,max(x,y));        if(x==0&&y==0)        {            int cot=0;            for(int i=0;i<=tmp;i++)            {                if(vis[i]==1&&father(i)==i)cot++;//非常之坑爹!                if(in[i]>1||cot>1)flag=0;                if(!flag)break;            }            if(flag)printf("Case %d is a tree.\n",treecot++);            else printf("Case %d is not a tree.\n",treecot++);            intt();            flag=1,tmp=0;        }        else        {            if(!flag)continue;            int fx=father(x);            int fy=father(y);            if(fx==fy)flag=0;            else                {                    fa[fy]=fx,in[y]++;                    vis[x]=vis[y]=1;                }        }    }}


0 0