并查集,不太好写
#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int father[N];
int find(int x)
{
int a = x;
while (x != father[x])
{
x = father[x];
}
while (a != x)
{
int tmp = father[a];
father[a] = x;
a = tmp;
}
return x;
}
void un(int a, int b)
{
int fa = find(a);
int fb = find(b);
if (fa != fb)
{
father[fa] = fb;
}
}
typedef struct
{
int id;
int cnt_house;
int area;
} Node;
Node node[N];
bool vis[N];
typedef struct
{
int minID;
int cnt_family;
int area;
int people;
int fafa;
} Family;
vector<Family> family;
bool cmp(Family a, Family b)
{
double aveA = a.area * 1.0 / a.people;
double aveB = b.area * 1.0 / b.people;
if (aveA != aveB)
return aveA > aveB;
else{
return a.minID < b.minID;
}
}
int main(void)
{
int n;
cin >> n;
set<int> S;
for (int i = 0; i < N; i++)
{
father[i] = i;
}
for (int i = 0; i < n; i++)
{
int id, fa, ma, k;
scanf("%d %d %d %d", &id, &fa, &ma, &k);
if (fa != -1)
{
un(id, fa);
S.insert(fa);
}
if (ma != -1)
{
un(id, ma);
S.insert(ma);
}
for (int j = 0; j < k; j++)
{
int child;
scanf("%d", &child);
un(id, child);
S.insert(child);
}
int cnt, area;
scanf("%d %d", &cnt, &area);
node[id] = {id, cnt, area};
S.insert(id);
}
for (auto it = S.begin(); it != S.end(); it++)
{
int v = find(*it);
if (!vis[v])
{
Family f;
f.minID = *it;
f.cnt_family = node[*it].cnt_house;
f.area = node[*it].area;
f.people = 1;
f.fafa = v;
family.push_back(f);
vis[v] = true;
}
else
{
for (int i = 0; i < family.size(); i++)
{
if (v == family[i].fafa)
{
family[i].cnt_family += node[*it].cnt_house;
family[i].area += node[*it].area;
family[i].people++;
}
}
}
}
cout << family.size() << endl;
sort(family.begin(), family.end(), cmp);
for (int i = 0; i < family.size(); i++)
{
printf("%04d %d %.3f %.3f\n",
family[i].minID, family[i].people, family[i].cnt_family * 1.0 / family[i].people, family[i].area * 1.0 / family[i].people);
}
return 0;
}