您的位置:首页 > 其它

hdu1856 More is better 并查集

2016-12-02 00:40 429 查看

More is better

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others)Total Submission(s): 25399    Accepted Submission(s): 9110Problem DescriptionMr Wang wants some boys to help him with a project. Because the project is rather complex, the more boys come, the better it will be. Of course there are certain requirements.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 arestill 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. InputThe first line of the input contains an integer n (0 ≤ n ≤ 100 000) - the number of direct friend-pairs. The following n lines each contains a pair of numbers A and B separated by a single space that suggests A and B are direct friends. (A ≠ B, 1 ≤ A, B ≤ 10000000) OutputThe output in one line contains exactly one integer equals to the maximum number of boys Mr Wang may keep.  Sample Input
41 23 45 61 641 23 45 67 8 Sample Output
42HintA and B are friends(direct or indirect), B and C are friends(direct or indirect),then A and C are also friends(indirect).In the first sample {1,2,5,6} is the result.In the second sample {1,2},{3,4},{5,6},{7,8} are four kinds of answers. Authorlxlcrystal@TJU SourceHDU 2007 Programming Contest - Final当天晚上脑袋真是被门夹了居然看出来了这个是并查集。。。。题意:有个人想要举办哲学party,由于这个是哲学party,所以希望男人越多越好,题目会告诉你m对关系,表示a和b是朋友,现在房间的主人要依次从房间里踢人,知道房间内任意两个人是朋友(直接或间接)那肯定是剩下一个最大的团啊。。。。。那不就是并查集吗?!直接查一查,然后看看谁的子孙最多啊虽然看那个点给的范围可能会超。。。。反正就写写写,。。。。。然后特判一下m==0然后就。。。没了#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int N = 10000010;int pre,judge;int maxn,ans;int Find(int index){int r=index;while(pre[r]!=r){r=pre[r];}if(pre[index]!=r){pre[index]=r;}return r;}void join(int a,int b){int i=Find(a);int j=Find(b);if(i!=j){pre[i]=j;judge[j]+=judge[i];}}int main(){int n,a,b,maxn;while (~scanf("%d",&n)) {ans = 1;maxn = 0;for(int i=1;i<N;i++){pre[i] = i;judge[i] = 1;}for(int i=0;i<n;i++){scanf("%d%d",&a,&b);maxn = max(maxn,max(a,b));join(a, b);}for(int i=1;i<=maxn;i++){ans = max(ans,judge[i]);}printf("%d\n",ans);}return 0;}
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: