pat A1114

网上找了一篇博客,链接给出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;
}

猜你喜欢

转载自blog.csdn.net/qq_38705851/article/details/82217058
PAT