HDU-1856 More is better

来源:互联网 发布:sql server error 26 编辑:程序博客网 时间:2024/05/02 00:15
#include <iostream>#include <cstdio>using namespace std;const int maxn = 1e7 + 5;int n;struct node{    int op;    int ed;} edge[maxn];int root[maxn];int num[maxn];int Find(int x){    return root[x] == x ? x : root[x] = Find(root[x]);}int main(){    while(~scanf("%d", & n))    {        for(int i = 0; i < n; i ++)            scanf("%d %d", & edge[i].op, & edge[i].ed);        for(int i = 1; i < maxn; i ++)  //初始化        {            root[i] = i;                //所有的root与下标相等(即根节点是自己本身)            num[i] = 1;                 //所有的数量为1        }        for(int i = 0; i < n; i ++)        {            int x = Find(edge[i].op);            int y = Find(edge[i].ed);            if(x != y)            {                root[y] = x;            //不断连接(y的根节点是x)                num[x] += num[y];       //不断将叶节点的数量累加到根节点            }        }        int num_max = 1;        for(int i = 1; i < maxn; i ++)            if(num[i] > num[num_max])                num_max = i;            //找最大数量        printf("%d\n", num[num_max]);    }    return 0;}

题意:
王老师要找一些男生帮助他完成一项工程。要求最后挑选出的男生之间都是朋友关系,可以说直接的,也可以是间接地。问最多可以挑选出几个男生(最少挑一个)。
题解:
(摘自LYHVOYAGE)这是一个有关并查集的题目。只不过不是求有几个集合,而是求每个集合中元素的个数,进而求出个数的最大值。和求集合个数的方法差不多,只需要在合并两个集合时处理一下,让这两个集合的元素个数也合并一下就行了。接下来只需要找出最大值即可。

0 0
原创粉丝点击