题目链接
解题思路:
并查集 + 结构体
具体看代码
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e4;
int f[maxn];
bool v[maxn];
struct node
{
int d;//编号
int f,m;//父亲 母亲
int num;//房产套数
int area;//总面积
int c[11];//孩子
}a[maxn];
struct S
{
int d;//家庭成员的最小编号
int people;//家庭人口数
double num;//人均房产套数
double area;//人均房产面积
bool flag=0;
}b[maxn];
int find(int x)
{
if(f[x]==x)
return x;
else
{
f[x]=find(f[x]);
return f[x];
}
}
int hebing(int x,int y)
{
int xx=find(x);
int yy=find(y);
if(xx<yy)
return f[yy]=xx;
if(xx>yy)
return f[xx]=yy;
}
bool cmp(S x,S y)
{
if(x.area!=y.area)
return x.area>y.area;
else
return x.d<y.d;
}
int main()
{
int n;
int i,j,k,x,y;
int ans=0;
cin>>n;
for(i=0;i<maxn;i++)
f[i]=i;
for(i=0;i<n;i++)
{
cin>>a[i].d>>a[i].f>>a[i].m>>k;
v[a[i].d]=true;
if(a[i].f!=-1)
{
v[a[i].f]=true;
hebing(a[i].f,a[i].d);
}
if(a[i].m!=-1)
{
v[a[i].m]=true;
hebing(a[i].m,a[i].d);
}
for(j=0;j<k;j++)
{
cin>>a[i].c[j];
v[a[i].c[j]]=true;
hebing(a[i].c[j],a[i].d);
}
cin>>a[i].num>>a[i].area;
}
for(i=0;i<n;i++)
{
x=find(a[i].d);
b[x].d=x;
b[x].num+=a[i].num;
b[x].area+=a[i].area;
b[x].flag=1;//标记下来 表示这是个家庭
}
for(i=0;i<maxn;i++)
{
if(v[i])
b[find(i)].people++;//这个人所在的家庭中的人的数量加1
if(b[i].flag)
ans++;//总的家庭数量
}
for(i=0;i<maxn;i++)
{
if(b[i].flag) //每找到一个家庭 就计算一下
{
b[i].num=(double)(b[i].num/b[i].people);
b[i].area=(double)(b[i].area/b[i].people);
}
}
sort(b,b+maxn,cmp);
cout<<ans<<endl;
for(i=0;i<ans;i++)
{
printf("%04d %d %.3lf %.3lf\n",b[i].d,b[i].people,b[i].num,b[i].area);
}
return 0;
}