1114 Family Property(25 分)(cj)

1114 Family Property(25 分)

This time, you are supposed to help us collect the data for family-owned property. Given each person's family members, and the estate(房產)info under his/her own name, we need to know the size of each family, and the average area and number of sets of their real estate.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤1000). Then N lines follow, each gives the infomation of a person who owns estate in the format:

ID Father Mother k Child​1​​⋯Child​k​​ M​estate​​ Area

where ID is a unique 4-digit identification number for each person; Father and Mother are the ID's of this person's parents (if a parent has passed away, -1will be given instead); k (0≤k≤5) is the number of children of this person; Child​i​​'s are the ID's of his/her children; M​estate​​ is the total number of sets of the real estate under his/her name; and Area is the total area of his/her estate.

Output Specification:

For each case, first print in a line the number of families (all the people that are related directly or indirectly are considered in the same family). Then output the family info in the format:

ID M AVG​sets​​ AVG​area​​

where ID is the smallest ID in the family; M is the total number of family members; AVG​sets​​ is the average number of sets of their real estate; and AVG​area​​ is the average area. The average numbers must be accurate up to 3 decimal places. The families must be given in descending order of their average areas, and in ascending order of the ID's if there is a tie.

Sample Input:

10
6666 5551 5552 1 7777 1 100
1234 5678 9012 1 0002 2 300
8888 -1 -1 0 1 1000
2468 0001 0004 1 2222 1 500
7777 6666 -1 0 2 300
3721 -1 -1 1 2333 2 150
9012 -1 -1 3 1236 1235 1234 1 100
1235 5678 9012 0 1 50
2222 1236 2468 2 6661 6662 1 300
2333 -1 3721 3 6661 6662 6663 1 100

Sample Output:

3
8888 1 1.000 1000.000
0001 15 0.600 100.000
5551 4 0.750 100.000

致命碘鹽.......... 並查集的找根節點的函數 沒寫return 找了幾個小時,....... 

#pragma warning(disable:4996)
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
class node {
public:
	int id, num;
	double avgarea, avgnum;
	node(int a, int b, double c, double d) {
		id = a, num = b, avgnum = c, avgarea = d;
	}
	node() {};
};
int parent[10000][4];
int isexist[10000];
int setfind(int x) {
	if (parent[x][0] == -1) return x;
	return parent[x][0] = setfind(parent[x][0]);
}
void setunion(int x, int y) {
	if (x == -1 || y == -1) return;
	int fx = setfind(x);
	int fy = setfind(y);
	if (fx == fy) return;
	if (fx < fy) {
		parent[fy][0] = fx;
	}
	else {
		parent[fx][0] = fy;
	}
}
void init() {
	for (int i = 0; i < 10000; ++i) {
		parent[i][0] = -1;
		parent[i][3] = 1;
	}
}
bool cmp(const node& x, const node& y) {
	if (x.avgarea == y.avgarea) return x.id < y.id;
	return x.avgarea > y.avgarea;
}
int main() {
	init();
	int n;
	cin >> n;
	int id, fid, mid, k, cid;
	for (int i = 0; i < n; ++i) {
		cin >> id >> fid >> mid >> k;
		isexist[id] = 1;
		if(fid != -1 ) isexist[fid] = 1;
		if(mid != -1 ) isexist[mid] = 1;
		setunion(id, fid);
		setunion(id, mid);
		while (k--) {
			cin >> cid;
			isexist[cid] = 1;
			setunion(id, cid);
		}
		cin >> parent[id][1] >> parent[id][2];
	}
	int num = 0;
	for (int i = 0; i < 10000; ++i) {
		int pa_i = setfind(i);
		if (pa_i != i) {
			parent[pa_i][1] += parent[i][1];
			parent[pa_i][2] += parent[i][2];
			parent[pa_i][3] ++;
		}
	}
	vector<node> varr;
	for (int i = 0; i < 10000; ++i) {
		if (isexist[i] && parent[i][0] == -1) {
			num++;
			int tmp = parent[i][3];
			varr.push_back(node(i, tmp, double(parent[i][1]) / tmp, double(parent[i][2]) / tmp));
		}
	}
	cout << num << endl;
	sort(varr.begin(), varr.end(),cmp);
	for (int i = 0; i < varr.size(); ++i) {
		printf("%04d %d %.3lf %.3lf\n", varr[i].id, varr[i].num, varr[i].avgnum, varr[i].avgarea);
	}
	system("pause");
	return 0;
}

 

發佈了156 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章