1114. Family Property (25)

#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>

using namespace std;

int tree[10000], sum[10000], flag[10000], estate[10000], area[10000], minindex[10000];
double avgarea[10000];
vector<int> v;

int findroot(int root)
{
	if(tree[root] == -1)
	{
		return root;
	}
	else
	{
		tree[root] = findroot(tree[root]);
		return tree[root];
	}
}

void init(int id)
{
	tree[id] = -1;
	sum[id] = 1;
	flag[id] = 1;

	v.push_back(id);
}

void buildrelation(int index[2])
{
	if(index[1] == -1)
	{
		return;
	}

	int i;
	for(i = 0; i <= 1; i++)
	{
		if(flag[index[i]] == 0)
		{
			init(index[i]);
		}
		else
		{
			index[i] = findroot(index[i]);
		}
	}

	if(index[0] == index[1])
	{
		return;
	}

	int index0 = index[0], index1 = index[1];
	if(sum[index1] > sum[index0])
	{
		index0 = index[1];
		index1 = index[0];
	}

	tree[index1] = index0;
	sum[index0] += sum[index1];

	estate[index0] += estate[index1];
	area[index0] += area[index1];
}

int cmp(int a, int b)
{
	if(avgarea[a] != avgarea[b])
	{
		return avgarea[a] > avgarea[b];
	}

	return minindex[a] < minindex[b];
}

int main()
{
	int n;
	scanf("%d", &n);

	int id, father, mother, k, i, j, child, curestate, curarea, index[2];
	for(i = 1; i <= n; i++)
	{
		scanf("%d%d%d%d", &id, &father, &mother, &k);

		index[0] = id;
		index[1] = father;
		buildrelation(index);

		index[1] = mother;
		buildrelation(index);

		for(j = 1; j <= k; j++)
		{
			scanf("%d", &child);

			index[1] = child;
			buildrelation(index);
		}

		scanf("%d%d", &curestate, &curarea);

		if(flag[id] == 0)
		{
			init(id);
		}

		id = findroot(id);
		estate[id] += curestate;
		area[id] += curarea;
	}

	memset(minindex, -1, sizeof(minindex));

	int size = v.size(), curindex, root;
	vector<int> res;

	for(i = 0; i < size; i++)
	{
		curindex = v[i];
		root = findroot(curindex);

		if(minindex[root] == -1 || curindex < minindex[root])
		{
			minindex[root] = curindex;
		}

		if(curindex == root)
		{
			avgarea[root] = area[root] * 1.0 / sum[root];
			res.push_back(root);
		}
	}

	size = res.size();
	printf("%d\n", size);

	sort(res.begin(), res.end(), cmp);

	for(i = 0; i < size; i++)
	{
		root = res[i];
		printf("%04d %d %.3lf %.3lf\n", minindex[root], sum[root], estate[root] * 1.0 / sum[root], avgarea[root]);
	}

	system("pause");
	return 0;
}

 

posted on 2025-11-25 09:07  王景迁  阅读(5)  评论(0)    收藏  举报

导航