题目:
刚学并查集,做题练习练习,写完忘了判断结点数目一直卡,后来给别人讲的时候忽然发现了这个问题就添加个判断。
代码:
#include <iostream> #include <stdio.h> #include <iomanip> #include <cmath> #include <cstring> #include <string> #include<iostream> #include<algorithm> #include<cstring> #include <cstdio> using namespace std; int a[100005]; int dp[100005]; int findx(int x) { while(a[x]!=x) { x=a[x]; } return x; } void link(int x,int y,int &z) { x=findx(x); y=findx(y); if(x!=y) { a[y]=x; z=1; } else { // cout<<x<<' '<<y<<endl; z=0; } } int main() { int n,m; int x,y,z,rr; while(1) { memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); rr=0; for(int i=0;i<=10000;i++) a[i]=i; int k=0; while(scanf("%d%d",&x,&y)) { if(x==0&&y==0&&k==0) { rr=0; break; } if(x==0&&y==0) break; if(x==-1&&y==-1) return 0; link(x,y,z); dp[x]=1;dp[y]=1; if(z==0) rr=1; k++; } int num=0; for(int i=1;i<100005;i++) { if(dp[i]&&a[i]==i) num++; } cout<<num<<endl; if(num>1) rr=1; if(rr) printf("No\n"); else printf("Yes\n"); } }