题目大意:给一个图,不能出现环,而且只能有一个联通子图。
好惆怅,又是爆栈又是wrong answer的。
#include<iostream> #include<cstdio> using namespace std; const int maxn=100005; int f[maxn],ans; bool v[maxn]; void init(){for(int i=1;i<=100000;i++) f[i]=i,v[i]=0;} int findset(int x){ return f[x]!=x?f[x]=findset(f[x]):f[x];} void merge(int a,int b) { int fa=findset(a); int fb=findset(b); if(fa==fb) ans=1; if(fa>fb) f[fa]=fb; else f[fb]=fa; } int main() { int a,b,i,sum; while(scanf("%d %d",&a,&b) && !(a==-1 && b==-1)) { ans=0; init(); while(1) { if(a==0 && b==0) break; merge(a,b);v[a]=v[b]=1; scanf("%d %d",&a,&b); } if(ans){ printf("No ");continue;} sum = 0; for(i = 1; i <= 100000; i++) if(v[i] && f[i] == i) sum++; if(sum > 1) printf("No "); else printf("Yes "); } return 0; }