网上找了一篇博客,链接给出https://blog.csdn.net/jolivan/article/details/59481949
但它存在一个问题:拥有共同孩子的两个人没有归到同一个家庭
自己动手修改后:
//pat A1114 Family Property(25 分)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=10010;
struct person{
int name;
int fa,ma;
vector<int>child;
double sets,area;
bool vis;
}pe[maxn];
struct family{
int head;
int numMember;
double totalSets,totalArea;
}fa[maxn];
bool cmp(family a,family b){
double avgA=a.totalArea/a.numMember;
double avgB=b.totalArea/b.numMember;
if(avgA==avgB){
return a.head<b.head;
}
return avgA>avgB;
}
void DFS(int u,int v){//u为person编号,v为family编号
if(u==-1){
return;
}
pe[u].vis=true;
fa[v].numMember++;
if(pe[u].name<fa[v].head){
fa[v].head=pe[u].name;
}
fa[v].totalArea+=pe[u].area;
fa[v].totalSets+=pe[u].sets;
int fath=pe[u].fa;
int moth=pe[u].ma;
// system("pause");
int child;
if(pe[fath].vis==false){
DFS(fath,v);
}
if(pe[moth].vis==false){
DFS(moth,v);
}
for(int i=0;i<pe[u].child.size();i++){
child=pe[u].child[i];
if(pe[child].vis==false){
DFS(child,v);
}
}
}
int main(){
for(int i=0;i<maxn;i++){//初始化
pe[i].area=0.0;
pe[i].sets=0.0;
pe[i].name=i;
pe[i].fa=-1;
pe[i].ma=-1;
pe[i].vis=false;
fa[i].head=10010;
fa[i].numMember=0;
fa[i].totalArea=0.0;
fa[i].totalSets=0.0;
}
int n;
scanf("%d",&n);
int toId[maxn];
int id,Fa,Ma,childNum,child;
for(int i=0;i<n;i++){
scanf("%d%d%d%d",&id,&Fa,&Ma,&childNum);
toId[i]=id;
pe[id].fa=Fa;
pe[id].ma=Ma;
if(Fa!=-1){
pe[Fa].child.push_back(id);
}
if(Ma!=-1){
pe[Ma].child.push_back(id);
}
for(int j=0;j<childNum;j++){
scanf("%d",&child);
pe[id].child.push_back(child);
if(pe[child].fa==id||pe[child].ma==id){
continue;
}
if(pe[child].fa==-1){
pe[child].fa=id;
}
else if(pe[child].ma==-1){
pe[child].ma=id;
}
}
scanf("%lf%lf",&pe[id].sets,&pe[id].area);
//printf("fa=%d ma=%d %.3f %.3f\n",Fa,Ma,pe[id].sets,pe[id].area);
}
int num=0;
for(int i=0;i<n;i++){
int id=toId[i];
if(pe[id].vis==false){
DFS(id,num);
num++;
}
}
sort(fa,fa+num,cmp);
printf("%d\n",num);
for(int i=0;i<num;i++){
printf("%04d %d %.3f %.3f\n",fa[i].head,fa[i].numMember,
fa[i].totalSets/fa[i].numMember,fa[i].totalArea/fa[i].numMember);
}
return 0;
}