A1114 Family Property (25 分)

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <set>
using namespace std;
const int inf = (1 << 31) - 10;
const int maxn = 10010;
struct Node{
//	int id;
	int s, area;
	set<int> memb;
}node[maxn];
struct Fam{
	int id, famNum; 
	double Savg, Aavg;
}fam[maxn];
int N;
int isId[maxn], used[maxn];
bool cmp(Fam f1, Fam f2){
	if(f1.Aavg != f2.Aavg) return f1.Aavg > f2.Aavg;
	return f1.id < f2.id;
}
int minId, famNum, Stotal, Atotal;
void dfs(int id){
	used[id] = 1;
	famNum++;
	Stotal += node[id].s;
	Atotal += node[id].area;
	minId = min(minId, id);
	set<int>::iterator it = node[id].memb.begin();
	for(; it != node[id].memb.end(); it++){
		if(!used[*it]) dfs(*it);
	}
	
}

void solve(){
	memset(used, 0, sizeof(used));
	int num = 0;
	for(int i = 0; i < 10000; i++){
		if(isId[i] && !used[i]){
			minId = inf; famNum = 0;
			Stotal = 0; Atotal = 0; 
			dfs(i);
			fam[num].id = minId;
			fam[num].famNum = famNum;
			fam[num].Savg = (double)Stotal/famNum;
			fam[num].Aavg = (double)Atotal/famNum;		
			num++;
		}
	}
	sort(fam, fam + num, cmp);
	printf("%d\n", num);
	for(int i = 0; i < num; i++){
		printf("%04d %d %.3f %.3f\n", fam[i].id, fam[i].famNum, 
									fam[i].Savg, fam[i].Aavg);
	}
}
int main() {
	//freopen("1.txt", "r", stdin);	
	memset(isId, 0, sizeof(isId));
	scanf("%d", &N);
	int id, fid, mid, k, cid;
	for(int i = 0; i < N; i++){
		scanf("%d %d %d %d", &id, &fid, &mid, &k);
		isId[id] = 1;
		if(fid != -1){
			isId[fid] = 1;
			node[fid].memb.insert(id);  
			node[id].memb.insert(fid);  
		}
		if(mid != -1){
			isId[mid] = 1;
			node[mid].memb.insert(id);
			node[id].memb.insert(mid);  
		}
		for(int j = 0; j < k; j++){
			scanf("%d", &cid);
			isId[cid] = 1;
			node[id].memb.insert(cid);
			node[cid].memb.insert(id);
		}
		scanf("%d %d", &node[id].s, &node[id].area);	
	}
	solve();
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值