在学习了并查集以后拿这道题来练手非常好,涉及了并查集以及结构体二级排序算法,非常基础但是要求代码
(一开始被自己坑了,在并查集找根时应该使用递归思想)
并查集的基本操作:
//非压缩路径法找根
int get_root(int a)
{
if(par[a]==a)
{
return a;
}
else
{
return get_root(par[a]);//注意这里的递归
}
}
//压缩路径法找根
int get_root(int a)
{
if(par[a]!=a)
{
par[a] = get_root(par[a]);
}
return par[a];
}
void merge(int a,int b)
{
int p1 = get_root(a);//这里要求找到根
int p2 = get_root(b);
if(p1==p2)
{
return ;
}
else//把p1作为p2的父节点 例如这个题要求输出家庭成员序号较小的
{
par[p2] = p1;
total[p1] += total[p2];//这一步是把b的人数加到a上
}
}
其余操作应该可以在这两种操作基础上实现
#include <iostream>
#include <cstring>
#incl