好累。
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
#define ll long long
int parent[10010],exist[10010];
struct node{
int rs;//人數
double mj,ts;//面積,套數
}s[10000];
bool cmp(int x,int y){
if(s[x].mj!=s[y].mj) return s[x].mj>s[y].mj;
return x < y;
}
int getf(int x){
int y=x;
while(parent[y]!=-1){
y=parent[y];
}
return y;
}
void merge(int x,int y){
int p1=getf(x);
int p2=getf(y);
if(p1==p2) return;
//比較小的
if(p1<p2) parent[p2]=p1;
else parent[p1]=p2;
}
int main(){
memset(parent,-1,sizeof(parent));
int n;
cin>>n;
for(int i=0;i<n;i++){
int sno,p1,p2,count,ch,ts,mj;
cin>>sno>>p1>>p2>>count;
exist[sno]=1;
if(p1!=-1) {
merge(sno,p1);
exist[p1]=1;
}
if(p2!=-1) {
merge(sno,p2);
exist[p2]=1;
}
for(int j=0;j<count;j++){
cin>>ch;
merge(sno,ch);
exist[ch]=1;
}
cin>>s[sno].ts>>s[sno].mj;
}
//彙總家庭人數 套數和麵積
vector<int> vec;
for(int i=0;i<10000;i++){
if(exist[i]){
int parent=getf(i);
if(parent!=i){
s[parent].ts += s[i].ts;
s[parent].mj += s[i].mj;
}else{
vec.push_back(parent);
}
s[parent].rs+=1;
}
}
for(int i=0;i<vec.size();i++){
int parent = vec[i];
s[parent].mj/=s[parent].rs;
s[parent].ts/=s[parent].rs;
}
sort(vec.begin(),vec.end(),cmp);
cout<<vec.size()<<'\n';
for(int i=0;i<vec.size();i++){
printf("%04d %d %.3lf %.3lf\n",vec[i],s[vec[i]].rs,s[vec[i]].ts,s[vec[i]].mj);
}
return 0;
}