欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - HDU1272
题意概括
给你一个图,让你判断是不是一棵树。
题解
我们不能简单的认为只要边数+1=点数就可以了。
这个图不一定是联通的。
解决这个的方法是:用并查集判断是否有环,然后再判断边数+1是否等于点数就可以了。
注意:没有边也算对的。(根据原题题意)
代码
#include <cstring> #include <algorithm> #include <cstdio> #include <cmath> #include <cstdlib> using namespace std; const int N=100005; int n,a,b,fa[N],f[N]; int getf(int k){ return fa[k]==k?k:fa[k]=getf(fa[k]); } int main(){ n=100000; while (1){ int cnte=1,cntn=0; scanf("%d%d",&a,&b); if (a==-1&&b==-1) break; for (int i=1;i<=n;i++) fa[i]=i; memset(f,0,sizeof f); if (a==0&&b==0){ puts("Yes"); continue; } fa[getf(a)]=getf(b); f[a]=f[b]=1; int res=1; while (1){ scanf("%d%d",&a,&b); if (a==0&&b==0) break; cnte++; f[a]=f[b]=1; int aa=getf(a),ab=getf(b); if (aa==ab) res=0; fa[aa]=ab; } for(int i=1;i<=n;i++) if (f[i]) cntn++; puts(res&&cntn==cnte+1?"Yes":"No"); } return 0; }