#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <ctime>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
using namespace std;
const int MAX = 10010, INF = 1<<30;
typedef struct Node
{
int ID;//记录这个人的id号
vector<int> Adj;//记录其亲戚的id号,包括父母和孩子
int estate, area;//财产
}Node;
typedef struct Root//每个家庭的信息
{
int ID;//该家庭最小的id号
int num;//成员数量
double estate, area;//平均资产
}Root;
int N;
Node G[MAX] = {0};
bool visited[MAX] = {0};
Root T[MAX] = {0};
int cnt = 0;//家庭个数计数
void BFS(int v)//BFS遍历每个家庭,并置为已访问,同时统计各家庭信息
{
queue<int> Q;
Q.push(v);
visited[v] = 1;
T[cnt].ID = v;
while(!Q.empty())
{
v = Q.front();
Q.pop();
T[cnt].estate += G[v].estate;
T[cnt].area += G[v].area;
T[cnt].num++;
for(int i=0; i<(int)G[v].Adj.size(); i++)
{
if(G[v].Adj[i] != -1 && !visited[G[v].Adj[i]])
{
Q.push(G[v].Adj[i]);
visited[G[v].Adj[i]] = 1;
T[cnt].ID = min(G[v].Adj[i], T[cnt].ID);
}
}
}
}
bool cmp(Root A, Root B)//按家庭财产排序
{
if(A.area != B.area) return A.area > B.area;
return A.ID < B.ID;
}
int main()
{
for(int i=0; i<MAX; i++) G[i].ID = -1;
scanf("%d", &N);
for(int i=0; i<N; i++)//用图进行存储每个家庭的关系图
{
int id, c_id, f_id, m_id, k;
scanf("%d", &id);
G[id].ID = id;
scanf("%d %d %d", &f_id, &m_id, &k);
if(f_id != -1)
{
G[id].Adj.push_back(f_id);
G[f_id].Adj.push_back(id);
}
if(m_id != -1)
{
G[id].Adj.push_back(m_id);
G[m_id].Adj.push_back(id);
}
for(int j=0; j<k; j++)
{
scanf("%d", &c_id);
G[id].Adj.push_back(c_id);
G[c_id].Adj.push_back(id);
}
scanf("%d %d", &G[id].estate, &G[id].area);
}
for(int i=0; i<MAX; i++)//BFS遍历每个家庭
{
if(!visited[i] && G[i].ID != -1)
{
BFS(i);
T[cnt].estate = 1.0*T[cnt].estate/T[cnt].num;
T[cnt].area = 1.0*T[cnt].area/T[cnt].num;
cnt++;
}
}
printf("%d\n", cnt);
sort(T, T+cnt, cmp);
for(int i=0; i<cnt; i++)
{
printf("%04d %d %.3f %.3f\n", T[i].ID, T[i].num, T[i].estate, T[i].area);
}
return 0;
}
PAT (Advanced Level) Practice A1114 Family Property (25 分)(无向图、BFS)
最新推荐文章于 2020-04-19 11:26:58 发布