PAT L2-007 家庭房产(25 分)(并查集)

在学习了并查集以后拿这道题来练手非常好,涉及了并查集以及结构体二级排序算法,非常基础但是要求代码

(一开始被自己坑了,在并查集找根时应该使用递归思想)

并查集的基本操作:

//非压缩路径法找根 
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 
#include 
#include 
using namespace std;
int par[10005];
int total[10005] = {1};

int taoshu[10005] = {0};
int mianji[10005] ={0};

int vis[10005] = {0};

struct ren
{
	int number;
	int renshu;
	double renjutaoshu;
	double renjunmianji;
}group[10005];
int cmp(ren a,ren b)
{
	if(a.renjunmianji==b.renjunmianji)
	{
		return a.numberb.renjunmianji;
}


int get_root(int a)
{
	if(par[a]==a)
	{
		return a;
	}
	else
	{
		return get_root(par[a]);
	}
}
void merge(int a,int b)
{
	int p1 = get_root(a);
	int p2 = get_root(b); 
	if(p1==p2)
	{
		return ;
	}
	else
	{
		taoshu[p1] += taoshu[p2];
		mianji[p1] += mianji[p2];
		total[p1] += total[p2];
		 par[p2] = p1;
	} 
}

int main(void)
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<10005;i++)//初始化 
	{
		par[i] = i;
		total[i] = 1;//每个组至少一个人 
	}
	for(int i=0;i

 

你可能感兴趣的:(数据结构)