给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。

输入格式:

输入第一行给出一个正整数N(≤1000),随后N行,每行按下列格式给出一个人的房产:

编号 父 母 k 孩子1 ... 孩子k 房产套数 总面积

其中编号是每个人独有的一个4位数的编号;分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k(0≤k≤5)是该人的子女的个数;孩子i是其子女的编号。

输出格式:

首先在第一行输出家庭个数(所有有亲属关系的人都属于同一个家庭)。随后按下列格式输出每个家庭的信息:

家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积

其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出,若有并列,则按成员编号的升序输出。

输入样例:

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 100

结尾无空行

输出样例:

3
8888 1 1.000 1000.000
0001 15 0.600 100.000
5551 4 0.750 100.000

结尾无空行

思路:算法部分就是简单的并查集,但数据处理等方面还挺复杂,一定要仔细。首先用个data结构体数组来存储输入的每个人的信息,用node结构体来存储每个家族的信息,其中包括该家族最小成员编号,人数,人均房产数量和人均房产面积,其中flag用来标识家族是否存在,因为数据量不大,要注意编码细节(人数1005和家庭数10005的设置)。输入人的信息时,将他和其父母孩子合并,并使祖先的编号最小,用vis数组标记该编号是否出现。合并之后遍历n个人,将其房产信息都加入到家族结构体中,最后还要排序,先按人均房产面积降序排列,再按编号升序排列。

#include<bits/stdc++.h>
using namespace std;struct data //存储输入的每个人的信息
{int id, fa, ma, k, num, area;int ch[6];
}a[1005];struct node //存储每个家族的信息,flag用来标识是否存在
{int idm, pp, flag;double num, area;
}fam[10005];int root[10005], vis[10005], n, res = 0; //res家庭数量int getr(int x) {if (root[x] == x)return x;elsereturn root[x] = getr(root[x]);
}void Union(int x, int y) {int xx = getr(x);int yy = getr(y);if (xx < yy)root[yy] = xx;elseroot[xx] = yy;
}bool cmp(node x, node y) {if (x.area == y.area)return x.idm < y.idm;elsereturn x.area > y.area;
}int main() {cin >> n;int i, j;for (i = 0; i < 10000; i++) {root[i] = i;}for (i = 0; i < n; i++) {cin >> a[i].id >> a[i].fa >> a[i].ma >> a[i].k;for (j = 0; j < a[i].k; j++)cin >> a[i].ch[j];cin >> a[i].num >> a[i].area;vis[a[i].id] = 1;if (a[i].fa != -1) {vis[a[i].fa] = 1;Union(a[i].id, a[i].fa);}if (a[i].ma != -1) {vis[a[i].ma] = 1;Union(a[i].id, a[i].ma);}for (j = 0; j < a[i].k; j++) {vis[a[i].ch[j]] = 1;Union(a[i].id, a[i].ch[j]);}}for (i = 0; i < n; i++) {int idr = getr(a[i].id);fam[idr].idm = idr;fam[idr].num += a[i].num;fam[idr].area += a[i].area;fam[idr].flag = 1;}for (i = 0; i < 10000; i++) {if (vis[i])fam[getr(i)].pp++;if (fam[i].flag)res++;}for (i = 0; i < 10000; i++) {if (fam[i].flag) {fam[i].num = fam[i].num * 1.0 / fam[i].pp;fam[i].area = fam[i].area * 1.0 / fam[i].pp;}}sort(fam, fam + 10000, cmp);cout << res << endl;for (i = 0; i < res; i++)printf("%04d %d %.3f %.3f\n", fam[i].idm, fam[i].pp, fam[i].num, fam[i].area); //注意编号的输出return 0;
}

数据结构与算法A实验六图论---7-6 家庭房产(并查集)相关推荐

  1. 数据结构与算法A实验六图论(C语言参考代码)

    7-1 列出连通集 (25 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序 ...

  2. 数据结构与算法A实验六图论---7-11 邻接表创建无向图

    采用邻接表创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数. 输入第二行为顶点的信息,每个顶点只能用一个字符表 ...

  3. 数据结构与算法A实验六图论---7-9 最短路径(并查集Dijkstra)

    给定一个有N个顶点和E条边的无向图,顶点从0到N−1编号.请判断给定的两个顶点之间是否有路径存在.如果存在,给出最短路径长度. 这里定义顶点到自身的最短路径长度为0. 进行搜索时,假设我们总是从编号最 ...

  4. 数据结构与算法A实验六图论---7-5 任务调度的合理性(拓扑排序)

    假定一个工程项目由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其它一些子任务后才能执行."任务调度"包括一组子任务.以及每个子任务可以执行所依赖的子任务集. 比如完 ...

  5. 数据结构与算法A实验六图论---7-4 公路村村通(最小生成树Prime和Kruskal算法)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...

  6. 数据结构与算法A实验六图论---7-10 邻接矩阵表示法创建无向图

    采用邻接矩阵表示法创建无向图G ,依次输出各顶点的度. 输入格式: 输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数. 输入第二行为顶点的信息,每个顶点只能用一 ...

  7. 数据结构与算法A实验六图论---7-2 哈利·波特的考试(Flody算法)

    哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等.反方向变化的魔咒就是简单地将原来的魔咒倒过来念 ...

  8. 数据结构与算法A实验六图论---7-12 Dijkstra算法(模板)

    给一个n(1 ≤ n ≤ 2500) 个点 m(1 ≤ m ≤ 6200) 条边的无向图,求 s 到 t 的最短路. 输入格式: 第一行四个由空格隔开的整数 n.m.s.t. 之后的 m 行,每行三个 ...

  9. 数据结构与算法A实验六图论---7-7 最短工期 (拓扑排序)

    一个项目由若干个任务组成,任务之间有先后依赖顺序.项目经理需要设置一系列里程碑,在每个里程碑节点处检查任务的完成情况,并启动后续的任务.现给定一个项目中各个任务之间的关系,请你计算出这个项目的最早完工 ...

最新文章

  1. sqlplus 远程连接 oracle 12514 错误
  2. WebLogic启动与简单项目配置
  3. android 如何修改百度导航诱导界面,Android 百度导航SDK
  4. 微软发布首个 Chromium Edge stable 预览版
  5. 火狐firebug,firepath以及Selenium IDE插件安装方法
  6. Protel99SE
  7. Python使用requests设置headers、cookies实现猫眼实时电影票房排行榜爬取
  8. 群晖docker火狐_群晖 篇一:群晖Docker下搭建ubuntu开发环境
  9. ImageIO类说明
  10. android 调用原生分享功能,调用Android 系统自带分享功能
  11. Java点集_java-二维点集的包装
  12. 2021邵阳市区三中高考成绩查询,2021年邵阳市普通高考科目及各科分数
  13. Advanced COM Interop
  14. redux和react-redux
  15. docker mysql 内存大小_docker容器内存占用过高(例如mysql)
  16. d3.js Zoomable Circle Packing 连线实现
  17. qq登录钓鱼php网页,PHP+JS模仿登录钓鱼
  18. 如何构建函数——C语言
  19. 六十星系之13太阴独坐辰戌
  20. React初级篇————基础项目搭建以及环境配置

热门文章

  1. 数字图像处理学习笔记 九 形态学处理
  2. Python 爬虫入门(二)—— IP代理使用 - 不剃头的一休哥 - 博客园
  3. 高等代数_证明_矩阵的任意特征值的代数重数大于等于其几何重数
  4. 整体变分法信号去噪_家里wifi信号差?给小白的无线排查操作指南
  5. 久等了!Docker容器常用命令
  6. 在Power BI中对Error值进行替换
  7. 探究以太坊 2.0 的分叉选择规则
  8. Java-JWT Utils
  9. 盘点丨全球政府机构十大网络安全事件
  10. 关于http请求中使用NameValuePair遇到的坑