这个题一看是用并查集,觉得这个题有些麻烦,所以记录一下
#include<bits/stdc++.h>
using namespace std;
const int maxn=100003;
int n,f[maxn];
struct node{
int peo,num;
int cov;
int s;
}a[maxn];
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
int union1(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx==fy) return fx;
if(fx<fy)
{
int t=fx;
fx=fy;fy=t;
}
a[fy].num+=a[fx].num;
a[fy].cov+=a[fx].cov;
a[fy].peo+=a[fx].peo;
a[fy].s=fy;
f[fx]=fy;
return fy;
}
int cmp1(node x,node y)
{
if(x.cov*1.0/x.peo!=y.cov*1.0/y.peo)
return x.cov*1.0/x.peo>y.cov*1.0/y.peo;
return x.s<y.s;
}
int main()
{
cin>>n;
for(int i=0;i<maxn;i++)
{
f[i]=i;
a[i].num=0;
a[i].cov=0;
a[i].peo=1;
}
while(n--)
{
int m,fa,ma,k;
cin>>m;
cin>>fa>>ma>>k;
a[m].s=m;
if(fa!=-1)
m=union1(fa,m);
if(ma!=-1)
m=union1(ma,m);
for(int i=0;i<k;i++)
{
int child;
cin>>child;
m=union1(child,m);
}
int c1,c2;
cin>>c1>>c2;
a[m].num+=c1;
a[m].cov+=c2;
}
sort(a,a+maxn,cmp1);
int c=0;
for(int i=0;i<maxn;i++)
{
if(a[i].num==0||find(a[i].s)!=a[i].s)
continue;
c++;
}
cout<<c<<endl;
for(int i=0;i<maxn;i++)
{
if(a[i].num==0||find(a[i].s)!=a[i].s)
continue;
// printf("%d\n",a[i].num);
printf("%04d %d %.3lf %.3lf\n",a[i].s,a[i].peo,a[i].num*1.0/a[i].peo,a[i].cov*1.0/a[i].peo);
}
return 0;
}