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 Child1⋯Childk Mestate 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, -1
will be given instead); k (0≤k≤5) is the number of children of this person; Childi's are the ID
's of his/her children; Mestate 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
AVGsets AVGarea
where ID
is the smallest ID in the family; M
is the total number of family members; AVGsets is the average number of sets of their real estate; and AVGarea 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;
}