【并查集】hdu 1856 More is better
n个元素的集合应用问题——并查集。
题目大意
n个元素,告诉它们的两两连接关系,求单个连通分支所含元素个数的最大值
说一下思路
经典的并查集求的是所含连通分支的个数,这道题求的是并查集森林最大点集数(元素数),思路是维护一个cnt[ ]数组,初始化元素所在集合为自身cnt[ ] = 1;当要合并时,父节点累加孩子节点,cnt[ y ] += cnt [ x ],最后输出最大值。
★这题没有离散化就过了,so big the memory is !~
参考代码
#include<bits/stdc++.h>
using namespace std;
const int _max = 1e7 + 10;
int n,a,b,pre[_max],cnt[_max],m;
void init(){
for(int i = 1;i <= _max;++ i){
pre[i] = i;//每个元素所在的森林初始化自身
cnt[i] = 1;//自身点数为1
}
}
int find(int x){//查,元素x的根节点
return pre[x] == x?x:pre[x] = find(pre[x]);
}
void join(int a,int b){
int x = find(a),y = find(b);
if(x != y) {//根节点不属于同一片森林
pre[x] = y;
cnt[y] += cnt[x];//y作父亲节点!!!
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif // ONLINE_JUDGE
while(scanf("%d",&n) == 1){
if(n == 0) {puts("1");continue;}//特判n == 0的情况
init();
m = 0;
for(int i = 0;i < n; ++ i){
scanf("%d%d",&a,&b);
join(a,b);
if(a > b) m = max(m,a);//找到最大的那个节点
else m = max(m,b);
}
printf("%d\n",*max_element(cnt+1,cnt+1+m));
}
return 0;
}
- 加粗
Ctrl + B
- 斜体
Ctrl + I
- 引用
Ctrl + Q
- 插入链接
Ctrl + L
- 插入代码
Ctrl + K
- 插入图片
Ctrl + G
- 提升标题
Ctrl + H
- 有序列表
Ctrl + O
- 无序列表
Ctrl + U
- 横线
Ctrl + R
- 撤销
Ctrl + Z
- 重做
Ctrl + Y
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-20 10:45:33