#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;
}
1114. Family Property (25)
最新推荐文章于 2019-10-11 16:38:56 发布