此题信息比较多,容易一眼不知道如何处理。
1、首先输入和输出的信息,都用结构体来定义。输入定为node[1010],输出定位ans[10000]
2、每次输入的一行家庭成员,都用union合并,这里对union做改动,使得father一直ID较小。
void Union(int a,int b){
int fa=findFather(a);
int fb=findFather(b);
//稍作修改
if(fa<fb) father[fb]=fa;
else father[fa]=fb;
}
3、 定义int have[10000],来记录id有没有出现过
4、统计
家族代表、房产套数、房产总面积 遍历node数组,同时标记家族代表的flag为true
家族人数、家族数 遍历have数组
5、接下来根据要求求平均排序即可
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
struct Node{
int id;int fu,mu;
int num;
int child[6];
int m;
int area;
}node[maxn];
struct Ans{
int id,m=0;
double sets,area;
bool flag=false;
}ans[10010];
int father[10010];
void init(){
for(int i=0;i<10010;i++){
father[i]=i;
}
}
int findFather(int a){
int x=a;
while(father[x]!=x) x=father[x];
while(father[a]!=a){
int z=a;
a=father[a];
father[z]=x;
}
return x;
}
void Union(int a,int b){
int fa=findFather(a);
int fb=findFather(b);
//稍作修改
if(fa<fb) father[fb]=fa;
else father[fa]=fb;
}
bool cmp(Ans a,Ans b){
if(a.area!=b.area) return a.area>b.area;
return a.id<b.id;
}
//想办法最后统计下~
int have[10010];
int main(){
int n;
cin>>n;
init();
for(int i=0;i<n;i++){
scanf("%d %d %d %d",&node[i].id,&node[i].fu,&node[i].mu,&node[i].num);
if(node[i].fu!=-1){
have[node[i].fu]=1;Union(node[i].fu,node[i].id);
}
if(node[i].mu!=-1){
have[node[i].mu]=1;Union(node[i].mu,node[i].id);
}
have[node[i].id]=1;
for(int j=0;j<node[i].num;j++){
scanf("%d",&node[i].child[j]);
Union(node[i].child[j],node[i].id);
have[node[i].child[j]]=1;
}
scanf("%d %d",&node[i].m,&node[i].area);
}
//统计家族 面积 数量
for(int i=0;i<n;i++){
int father=findFather(node[i].id);
ans[father].id=father;
ans[father].flag=true;
ans[father].area+=node[i].area;
ans[father].sets+=node[i].m;
}
//统计家族人数
int cnt=0;
for(int i=0;i<10000;i++){
if(have[i]==1){
ans[findFather(i)].m++;
}
if(ans[i].flag) cnt++;
}
for(int i=0;i<10000;i++){
if(ans[i].flag){
ans[i].area=(double)(ans[i].area*1.0/ans[i].m);
ans[i].sets=(double)(ans[i].sets*1.0/ans[i].m);
}
}
sort(ans,ans+10000,cmp);
printf("%d\n",cnt);
for(int i=0;i<cnt;i++){
printf("%04d %d %.3f %.3f\n",ans[i].id,ans[i].m,ans[i].sets,ans[i].area);
}
return 0;
}