点击打开链接
并查集的使用~
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <queue>
#include <set>
#include <cmath>
using namespace std;
struct Node {
int id;
int m;
int area;
Node() {
m = 0;
area = 0;
}
};
Node node[10010];
int father[10010];
bool vis[10010] = {false};
struct TNode {
int people;
double total_set;
double total_area;
TNode() {
people = 0;
total_set = 0;
total_area = 0;
}
};
struct ans {
int id;
int people;
double se;
double ar;
ans(int i, int p, double s, double a) {
id = i;
people = p;
se = s / p;
ar = a / p;
}
};
TNode tnode[10010];
bool vis_t[10010] = {false};
int findFather(int x) {
while (x != father[x]) {
x = father[x];
}
return x;
}
void Union(int a, int b) {
int fatX = findFather(a);
int fatY = findFather(b);
if (fatX > fatY) {
father[fatX] = fatY;
} else {
father[fatY] = fatX;
}
}
bool cmp(ans a, ans b) {
if (a.ar != b.ar) {
return a.ar > b.ar;
} else {
return a.id < b.id;
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < 10000; i++) father[i] = i;
int id, fid, mid, k, son_id;
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &node[i].id, &fid, &mid);
vis[node[i].id] = true;
if (fid != -1) {
Union(node[i].id, fid);
vis[fid] = true;
}
if (mid != -1) {
Union(node[i].id, mid);
vis[mid] = true;
}
scanf("%d", &k);
for (int j = 0; j < k; j++) {
scanf("%d", &son_id);
Union(node[i].id, son_id);
vis[son_id] = true;
}
scanf("%d%d", &node[i].m, &node[i].area);
}
vector<int> v;
for (int i = 0; i < 10000; i++) {
if (vis[i]) {
int id = findFather(i);
vis_t[id] = true;
tnode[id].people++;
tnode[id].total_set += node[i].m;
tnode[id].total_area += node[i].area;
}
}
vector<ans> an;
for (int i = 0; i < 10000; i++) {
if (vis_t[i]) {
an.push_back(ans(i, tnode[i].people, tnode[i].total_set, tnode[i].total_area));
}
}
sort(an.begin(), an.end(), cmp);
printf("%d\n", an.size());
for (int i = 0; i < an.size(); i++) {
printf("%04d %d %.3lf %.3lf\n", an[i].id, an[i].people, an[i].se, an[i].ar);
}
return 0;
}