并查集可以检查这个图是否为生成树。。。
#include <cstdio> #include <iostream> #include <cstring> using namespace std; int vis[100010]; int f[100010]; int fnd(int x) { int p=x,t; while(f[x]!=x) x=f[x]; while(x!=p) { t=f[p]; f[p]=x; p=t; } return p; } int main() { int a,b; while(scanf("%d%d",&a,&b),a!=-1) { for(int i=1;i<=100000;i++) f[i]=i; memset(vis,0,sizeof(vis)); int flag=0; // vis[a]=1;vis[b]=1; //f[a]=b; while(a!=0) { vis[a]=1;vis[b]=1; int fa=fnd(a),fb=fnd(b); if(fa==fb) //判断是否在一棵树上。 flag=1; else f[fa]=fb; scanf("%d%d",&a,&b); } int c=0; for(int i=1;i<=100000;i++)//判断是否一个连通图。。。 { if(vis[i]&&f[i]==i) { c++; if(c>=2) { flag=1; break; } } } if(flag==1) printf("No "); else printf("Yes "); } return 0; }