标签:最小生成树
并查集问题。。。
这题以前做过……
以前做过……
做过……
过……
不过重做时候被吭得异常之爽……
在判断 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; } } } }
HDU 1325 Is It A Tree? (POJ 1308),布布扣,bubuko.com
HDU 1325 Is It A Tree? (POJ 1308)
标签:最小生成树
原文地址:http://blog.csdn.net/dongshimou/article/details/36894947