PAT A-1114 Family Property (25 points)

Topic: 1114 Family Property (25 points)
Analysis : sort + union search, mainly because the data search is a bit more troublesome
#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;
}

Guess you like

Origin blog.csdn.net/qq_43567222/article/details/113883776