1114. Family Property (25)
This time, you are supposed to help us collect the data for family-owned property. Given each person's family members, and the estate(房产)info under his/her own name, we need to know the size of each family, and the average area and number of sets of their real estate.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (<=1000). Then N lines follow, each gives the infomation of a person who owns estate in the format:
ID Father Mother k Child1 ... Childk M_estate Area
where ID is a unique 4-digit identification number for each person; Father and Mother are the ID's of this person's parents (if a parent has passed away, -1 will be given instead); k (0<=k<=5) is the number of children of this person; Childi's are the ID's of his/her children; M_estate is the total number of sets of the real estate under his/her name; and Area is the total area of his/her estate.
Output Specification:
For each case, first print in a line the number of families (all the people that are related directly or indirectly are considered in the same family). Then output the family info in the format:
ID M AVG_sets AVG_area
where ID is the smallest ID in the family; M is the total number of family members; AVG_sets is the average number of sets of their real estate; and AVG_area is the average area. The average numbers must be accurate up to 3 decimal places. The families must be given in descending order of their average areas, and in ascending order of the ID's if there is a tie.
Sample Input:10 6666 5551 5552 1 7777 1 100 1234 5678 9012 1 0002 2 300 8888 -1 -1 0 1 1000 2468 0001 0004 1 2222 1 500 7777 6666 -1 0 2 300 3721 -1 -1 1 2333 2 150 9012 -1 -1 3 1236 1235 1234 1 100 1235 5678 9012 0 1 50 2222 1236 2468 2 6661 6662 1 300 2333 -1 3721 3 6661 6662 6663 1 100Sample Output:
3 8888 1 1.000 1000.000 0001 15 0.600 100.000 5551 4 0.750 100.000
https://www.patest.cn/contests/pat-a-practise/1114
思路:
转化为无向图,个人为节点,亲属关系即为节点之间的通路。
然后搜索联通块,计算,按规则排序。
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<cmath>
#include<algorithm>
#include<vector>
#define N 10100
using namespace std;
typedef struct S
{
int ind;
vector<int> fa;
vector<int> ch;
int num;
int ar;
};
typedef struct SS
{
int idm;
int np;
double se;
double area;
};
vector<SS> res;
S pe[N];
vector<int> mi;
bool flag[N];
vector<int> fam[N];
int nn;
void dfs(int n)
{
flag[n]=1;
fam[nn].push_back(n);
for (int i=0;i<pe[n].fa.size();i++)
{
if (flag[pe[n].fa[i]]!=1)
{
dfs(pe[n].fa[i]);
}
}
if (pe[n].ch.size()!=0)
{
for (int i=0;i<pe[n].ch.size();i++)
{
if (flag[pe[n].ch[i]]!=1)
{
dfs(pe[n].ch[i]);
}
}
}
}
bool cmp(SS a,SS b)
{
if (fabs(a.area-b.area)<0.0005)
{
return a.idm<b.idm;
}
else
{
return a.area>b.area;
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int id;
cin>>id;
pe[id].ind=id;
int _fa,_mo;
cin>>_fa>>_mo;
if (_fa!=-1) pe[id].fa.push_back(_fa);
if (_mo!=-1) pe[id].fa.push_back(_mo);
if (_fa!=-1) pe[_fa].ch.push_back(id);
if (_mo!=-1) pe[_mo].ch.push_back(id);
int k;
cin>>k;
for (int j=0;j<k;j++)
{
int cc;
cin>>cc;
pe[id].ch.push_back(cc);
pe[cc].fa.push_back(id);
}
cin>>pe[id].num>>pe[id].ar;
mi.push_back(id);
}
memset(flag,0,sizeof(flag));
nn=0;
for (int i=0;i<mi.size();i++)
{
if (flag[mi[i]]==0)
{
dfs(mi[i]);
nn++;
}
}
for (int i=0;i<nn;i++)
{
SS ne;
ne.se=0;
ne.area=0;
ne.np=fam[i].size();
int mii=100000;
for (int j=0;j<fam[i].size();j++)
{
mii=min(mii,fam[i][j]);
ne.se+=pe[fam[i][j]].num;
ne.area+=pe[fam[i][j]].ar;
//cout<<fam[i][j]<<" "<<pe[fam[i][j]].num<<" "<<pe[fam[i][j]].ar<<endl;
}
ne.idm=mii;
ne.se=ne.se/(double)(ne.np*1.0);
ne.area=ne.area/(double)(ne.np*1.0);
res.push_back(ne);
//cout<<endl;
}
sort(res.begin(),res.end(),cmp);
cout<<nn<<endl;
for (int i=0;i<nn;i++)
{
printf("%04d %d %.3lf %.3lf\n",res[i].idm,res[i].np,res[i].se,res[i].area);
}
return 0;
}