标签:des style color strong os for
4 1 2 3 4 5 6 1 6 4 1 2 3 4 5 6 7 8
42
题意:给你一大堆人的关系,要你求出最多能留下多少人(留下的人必须是朋友)
思路:按照并查集的性质,每次遇到有关系的人,检查一下2人是否已经在前面的关系网中出现了,如果没出现,就加上2人当前的集合,详细过程请看代码
AC代码:
#include<stdio.h> #include<algorithm> using namespace std; #define N 100010 int f[N],maxx[N]; bool cmp(int x,int y) { return x>y; } int find(int x) { if(x!=f[x]) f[x]=find(f[x]); return f[x]; } void make(int x,int y) { int a,b; a=find(x); b=find(y); if(a!=b) //如果不相等 { f[a]=b; maxx[a]+=maxx[b]; //那么就让集合变为2个集合的和 maxx[b]=maxx[a]; } } int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<N;i++){ f[i]=i; maxx[i]=1; //先让每个人在不同的集合中,所以集合的初值是1 } while(n--) { int a,b; scanf("%d %d",&a,&b); //输入有朋友关系的人 make(a,b); } sort(maxx,maxx+N,cmp); //排序 printf("%d\n",maxx[0]); //输出最大的解 } return 0; }
HDU 1856 More is better,布布扣,bubuko.com
标签:des style color strong os for
原文地址:http://blog.csdn.net/u012313382/article/details/37830065