这道题是下午看的,当时看了不会,后来看算法导论上有,有看了一些其他的资料,就做出来了。不过杭电数据坑爹啊,,,竟然有n=0的情况,让我wr了好几次。。。。题目:
More is better
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others)
Total Submission(s): 4078 Accepted Submission(s): 1511
Mr Wang selected a room big enough to hold the boys. The boy who are not been chosen has to leave the room immediately. There are 10000000 boys in the room numbered from 1 to 10000000 at the very beginning. After Mr Wang's selection any two of them who are still in this room should be friends (direct or indirect), or there is only one boy left. Given all the direct friend-pairs, you should decide the best way.
ac代码:
#include <iostream> #include <cstdio> #include <string.h> using namespace std; const int N=10000005; int maxx,father[N],rankk[N]; void init(int x){ for(int i=0;i<N;++i) {father[i]=i;rankk[i]=1;} } int find(int x){ if(father[x]!=x) father[x]=find(father[x]); return father[x]; } void unionset(int a,int b){ int x=find(a); int y=find(b); if(x==y) return; if(rankk[x]>=rankk[y]){ father[y]=x; rankk[x]+=rankk[y]; if(rankk[x]>maxx) maxx=rankk[x]; } else{ father[x]=y; rankk[y]+=rankk[x]; if(rankk[y]>maxx) maxx=rankk[y]; } } int main(){ int n; while(scanf("%d",&n)!=EOF){ if(n==0) { printf("1\n");continue;} init(n); maxx=0; int a,b; while(n--){ scanf("%d%d",&a,&b); unionset(a,b); } printf("%d\n",maxx); } return 0; }