#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
int father[10000];
struct Node {
int estate_num;
int estate_area;
};
struct ansNode {
int no;
int num;
double avg_sets;
double avg_area;
}ans[1004];
unordered_map<int, Node> mp;
unordered_set<int> s;
unordered_map<int, set<int> > mpset;
void initial() {
for (int i = 1; i < 10000; i++) {
father[i] = i;
}
}
int findFather(int x) {
int z = x;
while (x != father[x]) {
x = father[x];
}
while (z != father[z]) {
int n = z;
z = father[z];
father[n] = x;
}
return x;
}
void Union(int a, int b) {
int af = findFather(a);
int bf = findFather(b);
if (af != bf) father[bf] = af;
}
int cmp(ansNode a, ansNode b) {
if (a.avg_area != b.avg_area) return a.avg_area > b.avg_area;
else return a.no < b.no;
}
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("Text.txt", "r", stdin);
#endif // ONLINE_JUDGE
initial();
int N; scanf("%d", &N);
for (int i = 0; i < N; i++) {
int p, pfather, pmother, child_num, child, estate_num, estate_area;
scanf("%d %d %d %d", &p, &pfather, &pmother, &child_num);
s.insert(p);
if (pfather != -1) {Union(p, pfather); s.insert(pfather);}
if (pmother != -1) {Union(p, pmother); s.insert(pmother);}
for (int j = 0; j < child_num; j++) {
scanf("%d", &child);
Union(p, child);
s.insert(child);
}
scanf("%d %d", &estate_num, &estate_area);
mp[p].estate_num = estate_num;
mp[p].estate_area = estate_area;
}
int sum = 0;
for (auto it = s.begin(); it != s.end(); it++) {
if (father[(*it)] == (*it)) sum++;
}
cout << sum << endl;
for (auto it = s.begin(); it != s.end(); it++) {
mpset[findFather((*it))].insert((*it));
}
int cnt = 0;
for (auto it = mpset.begin(); it != mpset.end(); it++) {
for (auto it2 = (it->second).begin(); it2 != (it->second).end(); it2++) {
ans[cnt].num++;
ans[cnt].avg_sets += mp[(*it2)].estate_num;
ans[cnt].avg_area += mp[(*it2)].estate_area;
}
ans[cnt].no = *(it->second).begin();
ans[cnt].avg_area = ans[cnt].avg_area / ans[cnt].num;
ans[cnt].avg_sets = ans[cnt].avg_sets / ans[cnt].num;
cnt++;
}
sort(ans, ans + cnt, cmp);
for (int i = 0; i < cnt; i++) {
printf("%04d %d ", ans[i].no, ans[i].num);
printf("%.3f %.3f\n", ans[i].avg_sets, ans[i].avg_area);
}
}
没写注释,三天后这个代码就不是我的了,。
猜你喜欢
转载自blog.csdn.net/qq_39072627/article/details/107483005
今日推荐
周排行