A1114 Family Property [并查集]

在这里插入图片描述
唉 自己没想出来 二刷再来看吧

#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct Data
{
	int id, fid, mid, estate, area;
	int cid[10];
}dt[1005];
struct node
{
	int id, people;
	double estate, area;
	bool flag = false;
}ans[10000];
int father[10000];
bool visit[10000];
int find(int x)
{
	while (x != father[x])
		x = father[x];
	return x;
}

void Union(int a, int b)
{
	int faA = find(a);
	int faB = find(b);
	if (faA > faB)
		father[faA] = faB;
	else if (faA < faB)
		father[faB] = faA;
}

int cmp(node a, node b)
{
	if (a.area != b.area)
		return a.area > b.area;
	else
		return a.id < b.id;
}

int main()
{
	int n, k, cnt = 0;
	cin >> n;
	for (int i = 0; i < 10000; i++)
		father[i] = i;
	for (int i = 0; i < n; i++)
	{
		cin >> dt[i].id >> dt[i].fid >> dt[i].mid >> k;
		visit[dt[i].id] = true;
		if (dt[i].fid != -1)
		{
			visit[dt[i].fid] = true;
			Union(dt[i].fid, dt[i].id);
		}
		if (dt[i].mid != -1)
		{
			visit[dt[i].mid] = true;
			Union(dt[i].mid, dt[i].id);
		}
		for (int j = 0; j < k; j++)
		{
			cin >> dt[i].cid[j];
			visit[dt[i].cid[j]] = true;
			Union(dt[i].cid[j], dt[i].id);
		}
		cin >> dt[i].estate>> dt[i].area;
	}
	for (int i = 0; i < n; i++)
	{
		int id = find(dt[i].id);
		ans[id].id = id;
		ans[id].estate += dt[i].estate;
		ans[id].area += dt[i].area;
		ans[id].flag = true;
	}
	
	for (int i = 0; i < 10000; i++)
	{
		if(visit[i])
			ans[find(i)].people++;
		if (ans[i].flag)
			cnt++;
	}
	for (int i = 0; i < 10000; i++)
	{
		if (ans[i].flag)
		{
			ans[i].estate = ans[i].estate / ans[i].people;
			ans[i].area = ans[i].area / ans[i].people;
		}
	}
	sort(ans, ans + 10000, cmp);
	printf("%d\n", cnt);
	for (int i = 0; i < cnt; i++)
		printf("%04d %d %.3f %.3f\n", ans[i].id, ans[i].people, ans[i].estate, ans[i].area);
	return 0;

}
posted @ 2020-08-10 10:26  _Hsiung  阅读(55)  评论(0编辑  收藏  举报