PAT甲级-1114 Family Property (25 分)

题目:1114 Family Property (25 分)
分析:排序+并查集,主要就是数据的查找比较麻烦一点点
#include <iostream>
#include<cstring>
#include<vector>
#include<map>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define MAX 999999999
int n,m;
struct Node{
    int id,fa,mo;
    int k;
    vector<int>child;
    int estate,area;
}node[10001];
struct Node2{
    int id,num;
    int as,aa;
}node2[10001];
int fa[10001];
int visi[10001];
int cmp(Node2 a,Node2 b)
{
    if(1.0*a.aa/a.num != 1.0*b.aa/b.num) return 1.0*a.aa/a.num > 1.0*b.aa/b.num;
    return a.id < b.id;
}
int findFa(int x)
{
    if(x == fa[x]) return x;
    return findFa(fa[x]);
}
void uni(int a,int b)
{
    fa[findFa(a)] = findFa(b);
}
int main()
{
    cin>>n;
    for(int i = 0;i < 10001;i++)
        fa[i] = i;
    for(int i = 0 ; i < n ; i++)
    {
        int id,fa,mo,k;
        cin>>id>>fa>>mo>>k;
        node[id].fa = fa,node[id].mo = mo,node[id].id = id,node[id].k = k;
        visi[id] = 1;
        if(fa != -1){
            uni(fa,id);
            visi[fa] = 1;
        }
        if(mo != -1){
            uni(mo,id);
            visi[mo] = 1;
        }
        for(int j = 0 ; j < k ;j++)
        {
            int c;cin>>c;
            node[id].child.push_back(c);
            uni(c,id);
            visi[c] = 1;
        }
        int es,ar;
        cin>>es>>ar;
        node[id].estate = es,node[id].area = ar;
    }
    int cnt = 0;
    for(int i = 0 ; i < 10001;i++)
        if(fa[i] == i && visi[i] == 1)
            cnt++;
    cout<<cnt<<endl;
    int cnt2 = 0;
    for(int i = 0 ; i < 10001;i++)
    {
        if(fa[i] == i && visi[i] == 1)
        {
            int f = 0;
            for(int j = 0 ; j < 10001 ; j ++)
            {
                if(findFa(i) == findFa(j))
                {
                    if(f == 0){
                        node2[cnt2].id = j;
                        f = 1;
                    }
                    node2[cnt2].num++;
                    node2[cnt2].as += node[j].estate;
                    node2[cnt2].aa += node[j].area;
                }
            }
            cnt2++;
        }
        if(cnt2 == cnt)break;
    }
    sort(node2,node2+cnt,cmp);
    for(int i = 0 ; i < cnt ; i++)
    printf("%04d %d %.3f %.3f\n",node2[i].id,node2[i].num,1.0*node2[i].as / node2[i].num,1.0*node2[i].aa / node2[i].num);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值