1114. Family Property (25)

本文介绍了一个用于统计家庭成员财产信息的算法实现。该算法通过广度优先搜索(BFS)遍历家庭成员之间的关系网络,计算每个家庭的平均财产价值和平均房产面积。最终输出家庭的基本信息、成员数及平均财产等统计数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1114. Family Property (25)

#include <iostream>
#include <vector>
#include <map>
#include <cstdio>
#include <algorithm>
using namespace std;
struct family
{
    vector<int> memid;
    int estate;
    int area;
}v[10000];
struct answer
{
    int minid;
    int membernum;
    double avesets,avearea;
}ans[1000];
int visited[10000];
int sumthismem=0,minid=10000;
double sumset=0.0,sumarea=0.0;
int queue[1000],front,rear;
bool comp(const answer &a,const answer &b)
{
    if(a.avearea!=b.avearea)
        return a.avearea>b.avearea;
    else
        return a.minid<b.minid;
}
void BFS(int id)
{
    int s;
    front=rear=0;
    queue[rear++]=id;
    visited[id]=1;
    while(front!=rear)
    {
        s=queue[front++];
        minid=(s<minid)?s:minid;
        ++sumthismem;
        sumarea+=v[s].area;
        sumset+=v[s].estate;
        for(auto it=v[s].memid.begin();it!=v[s].memid.end();++it)
        {
            if((*it)!=-1&&!visited[*it])
            {
                visited[*it]=1;
                queue[rear++]=*it;
            }
        }
    }
}
int main()
{
    int n,k=0;
    vector<int> rev;
    cin>>n;
    while(n--)
    {
        int id,f,m,k,temp;
        cin>>id>>f>>m>>k;
        rev.push_back(id);
        v[id].memid.push_back(f);
        if(f!=-1)v[f].memid.push_back(id);
        v[id].memid.push_back(m);
        if(m!=-1)v[m].memid.push_back(id);
        for(int i=0;i<k;++i)
        {
            cin>>temp;
            v[id].memid.push_back(temp);
            v[temp].memid.push_back(id);
        }
        cin>>v[id].estate>>v[id].area;
    }
    for(auto it=rev.begin();it!=rev.end();++it)
    {
        if(!visited[*it])
        {
            sumthismem=0,minid=10000;
            sumset=0.0,sumarea=0.0;
            BFS(*it);
            ans[k].minid=minid;
            ans[k].membernum=sumthismem;
            ans[k].avearea=sumarea/sumthismem;
            ans[k].avesets=sumset/sumthismem;
            ++k;
        }
    }
    sort(ans,ans+k,comp);
    cout<<k<<endl;
    for(int i=0;i<k;++i)
        printf("%04d %d %.3lf %.3lf\n",ans[i].minid,ans[i].membernum,ans[i].avesets,ans[i].avearea);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值