HDU 1856 More is better
Posted 谦谦君子,陌上其华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1856 More is better相关的知识,希望对你有一定的参考价值。
http://acm.hdu.edu.cn/showproblem.php?pid=1856
题意:
王先生想要一些男孩帮助他做一个项目。因为项目相当复杂,男孩越多,越好。当然有一定的要求。
王先生选择了一个足够大的房间来容纳男孩。没有被选中的男孩必须立即离开房间。有10000000的男孩在房间号从1到10000000在一开始。王先生选择后,仍然在这个房间里的任何两个人应该是朋友(直接或间接),或者只剩下一个男孩。给定所有的直接朋友对,你应该决定最好的方法。
思路:
并查集。选出顶点数最多的并输出。
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 #define N 10000000 7 8 int p[N], num[N], maxd; 9 10 void init() 11 { 12 int i; 13 for (i = 1; i <= N; i++) 14 { 15 p[i] = i; 16 num[i] = 1; 17 } 18 } 19 20 int find(int x) 21 { 22 if (p[x] != x) 23 p[x] = find(p[x]); 24 return p[x]; 25 } 26 27 void merge(int a, int b) 28 { 29 int x = find(a); 30 int y = find(b); 31 if (x != y) 32 { 33 p[x] = y; 34 num[y] += num[x]; 35 maxd = max(maxd, num[y]); 36 } 37 } 38 39 int main() 40 { 41 //freopen("D:\\txt.txt", "r", stdin); 42 int n, a, b; 43 while (~scanf("%d", &n)) 44 { 45 if (n == 0) 46 { 47 printf("1\n"); 48 continue; 49 } 50 maxd = 0; 51 init(); 52 for (int i = 0; i<n; i++) 53 { 54 scanf("%d%d", &a, &b); 55 merge(a, b); 56 } 57 printf("%d\n", maxd); 58 } 59 return 0; 60 }
以上是关于HDU 1856 More is better的主要内容,如果未能解决你的问题,请参考以下文章