一、题目概述
依据给定个人房产信息、家族信息,统计:
1、家族数量(有任一种血缘关系即属于同一家族);
2、各家族的:家族代表(全家最小ID)、家族成员数、家族平均房产数、家族平均房产面积。
二、思路
无向图dfs统计。
set作为数据结构存储所有id,实现id升序遍历,则家族遍历起点即家族代表id(最小号id)。
三、代码
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> G[10000], visited(10000, 0), sets(10000), area(10000), id(10000);
struct node
{
int id, M;
double avg_sets, avg_area;
};
int cmp(node a, node b)
{
if(a.avg_area != b.avg_area)
return a.avg_area > b.avg_area;
return a.id < b.id;
}
void dfs(int v, node &rec)
{
visited[v] = 1;
rec.id = min(v, rec.id);
++rec.M;
rec.avg_sets += sets[v];
rec.avg_area += area[v];
for(int i = 0; i < G[v].size(); ++i)
if(!visited[G[v][i]])
dfs(G[v][i], rec);
}
int main()
{
int N;
vector<node> ans;
scanf("%d", &N);
for(int i = 0, p[2], k; i < N; ++i)
{
scanf("%d %d %d %d", &id[i], &p[0], &p[1], &k);
for(int j = 0; j < 2; ++j)
if(p[j] != -1)
{
G[p[j]].push_back(id[i]);
G[id[i]].push_back(p[j]);
}
for(int j = 0, v; j < k; ++j)
{
scanf("%d", &v);
G[v].push_back(id[i]);
G[id[i]].push_back(v);
}
scanf("%d %d", &sets[id[i]], &area[id[i]]);
}
for(int i = 0; i < N; ++i)
if(!visited[id[i]])
{
node temp = {10000, 0, 0, 0};
dfs(id[i], temp);
temp.avg_sets /= temp.M;
temp.avg_area /= temp.M;
ans.push_back(temp);
}
sort(ans.begin(), ans.end(), cmp);
printf("%d\n", ans.size());
for(int i = 0; i < ans.size(); ++i)
printf("%04d %d %.3lf %.3lf\n", ans[i].id, ans[i].M, ans[i].avg_sets, ans[i].avg_area);
}