题意:给出每个人的家庭成员信息和自己的房产个数与房产总面积,让你统计出每个家庭的人口数、人均房产个数和人均房产面积。第一行输出家庭个数,随后每行输出家庭成员的最小编号、家庭人口数、人均房产个数、人均房产面积。

并查集,合并的时候编号小的作为父亲节点,最后父亲节点一样的即属于一个家庭,其它都是细节处理没啥好说了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
/*
并查集
*/
const int maxn=+;
int vis[maxn];
struct UF{
int father[maxn];
void init(){
for(int i=;i<maxn;i++){
father[i]=i;
}
}
int find_root(int x){
if(father[x]!=x){
father[x]=find_root(father[x]);
}
return father[x];
}
void Union(int a,int b){
int fa=find_root(a);
int fb=find_root(b);
if(fa!=fb){
father[max(fa,fb)]=min(fa,fb); //最小编号的作为祖先
}
}
}uf; struct Person{
int id;
int dad,mom;
int k;
int child[];
int m_estate;
int area;
}person[maxn]; struct Family{
int minid; //家庭成员最小编号
int m=; //家庭人口数
int m_estate=; //总房产数目
int totarea=; //总房产面积
float AVG_sets; //人均房产个数
float AVG_area; //人均房产面积
bool operator<(const Family tmp)const{
if(AVG_area==tmp.AVG_area){
return minid<tmp.minid;
}
else{
return AVG_area>tmp.AVG_area;
}
}
}family[maxn]; int main()
{
int n,id;
scanf("%d",&n);
uf.init();
memset(vis,,sizeof(vis));
for(int i=;i<maxn;i++)
person[i].id=-;
for(int i=;i<n;i++){
scanf("%d",&id);
person[id].id=id;
scanf("%d %d %d",&person[id].dad,&person[id].mom,&person[id].k);
vis[person[id].id]=; //标记出现过的编号
if(person[id].dad!=-){
uf.Union(id,person[id].dad);
vis[person[id].dad]=;
}
if(person[id].mom!=-){
uf.Union(id,person[id].mom);
vis[person[id].mom]=;
}
for(int j=;j<person[id].k;j++){
scanf("%d",&person[id].child[j]);
uf.Union(id,person[id].child[j]);
vis[person[id].child[j]]=;
}
scanf("%d %d",&person[id].m_estate,&person[id].area);
}
int idArray[maxn];
int cnt=;
for(int i=;i<maxn;i++){
if(vis[i]==){
idArray[cnt++]=i; //出现过的编号存起来
}
}
memset(vis,,sizeof(vis));
int u,fa;
for(int i=;i<cnt;i++){
u=idArray[i];
fa=uf.find_root(idArray[i]);
vis[fa]=; //标记父亲节点
family[fa].minid=fa;
family[fa].m++;
if(person[u].id!=-){
family[fa].totarea+=person[u].area;
family[fa].m_estate+=person[u].m_estate;
}
}
int familyNum=;
for(int i=;i<maxn;i++){
if(vis[i]){
familyNum++;
family[i].AVG_sets=family[i].m_estate*1.0f/family[i].m;
family[i].AVG_area=family[i].totarea*1.0f/family[i].m;
}
}
sort(family,family+maxn);
printf("%d\n",familyNum);
for(int i=;i<familyNum;i++){
printf("%04d %d %.3f %.3f\n",family[i].minid,family[i].m,family[i].AVG_sets,family[i].AVG_area);
}
return ;
}

PAT甲题题解-1114. Family Property (25)-(并查集模板题)的更多相关文章

  1. PAT题解-1118. Birds in Forest (25)-(并查集模板题)

    如题... #include <iostream> #include <cstdio> #include <algorithm> #include <stri ...

  2. HDU 1213 - How Many Tables - [并查集模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Today is Ignatius' birthday. He invites a lot of ...

  3. 杭电ACM省赛集训队选拔赛之热身赛-How Many Tables,并查集模板题~~

    How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. 种族并查集模板题分析 -----P2024 [NOI2001]食物链

    本文参考了:洛谷p2024题解 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都 ...

  5. POJ1611 The Suspects 并查集模板题

    题目大意:中文题不多说了 题目思路:将每一个可能患病的人纳入同一个集合,然后遍历查找每个点,如果改点点的根节点和0号学生的根节点相同,则该点可能是病人. 模板题并没有思路上的困难,只不过在遍历时需要额 ...

  6. HDU-1232/NYOJ-608畅通工程,并查集模板题,,水过~~~

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) http://acm. ...

  7. 并查集模板题----P3367 【模板】并查集

    题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入格式 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1时,将Xi与Yi ...

  8. HDU1232 畅通工程 (并查集模板题)

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. 并查集模板题(The Suspects )HZNU寒假集训

    The Suspects Time Limit: 1000MS Memory Limit: 20000KTotal Submissions: 36817 Accepted: 17860 Descrip ...

随机推荐

  1. java使用elasticsearch进行模糊查询-已在项目中实际应用

    java使用elasticsearch进行模糊查询 使用环境上篇文章本人已书写过,需要maven坐标,ES连接工具类的请看上一篇文章,以下是内容是笔者在真实项目中运用总结而产生,并写的是主要方法和思路 ...

  2. 【adb命令】在cmd窗口中使用adb install命令安装 中文名字apk报错的解决办法

    1.在cmd窗口中使用adb install命令安装中文名字apk报错,安装英文名字apk就正常,详细报错如下图: 2.查看adb版本号:adb version 3.怀疑是adb版本的原因,尝试换个最 ...

  3. Volley源码分析(二)CacheDispatcher分析

    CacheDispatcher 缓存分发 cacheQueue只是一个优先队列,我们在start方法中,分析了CacheDispatcher的构成是需要cacheQueue,然后调用CacheDisp ...

  4. C# winform单元格的formatted值的类型错误 DataGridView中CheckBox列运行时候System.FormatException异常

    在DataGridView手动添加了CheckBox列;在窗体Show的时候,遇到一个错误:错误如下: DataGridView中发生一下异常:System.FormatException:单元格的F ...

  5. 关于JRebel启动tomcat访问上次工程的index.jsp

    检查了一下,原来我把上次配置文件包括JRebel配置文件一起复制过来,用JRebel启动时tomcat访问JRebel配置文件的目录下 这个是我上次文件的路径,把JRebel配置文件删除了,然后 di ...

  6. 了解linux的进程:rootfs与linuxrc

    导读 内核启动的最后阶段启动了三个进程进程0:进程0其实就是刚才讲过的idle进程,叫空闲进程,也就是死循环.进程1:kernel_init函数就是进程1,这个进程被称为init进程.进程2:kthr ...

  7. JS仿QQ空间鼠标停在长图片时候图片自动上下滚动效果

    JS仿QQ空间鼠标停在长图片时候图片自动上下滚动效果 今天是2014年第一篇博客是关于类似于我们的qq空间长图片展示效果,因为一张很长的图片不可能全部把他展示出来,所以外层用了一个容器给他一个高度,超 ...

  8. Python2.7-os.path

    os.path 模块,实现了对文件路径的操作,但是不操作文件.由于不同系统文件路径格式不同,os.path 总是调用适合当前系统的版本,你也可以手动导入别的系统的(posixpath,ntpath,m ...

  9. Android 混淆打包

    有些时候我们希望我们自己的apk包不能被别人反编译而获取自己的源代码.这就需要我们通过Android提供的混淆打包技术来完成. 一.没有引用外部包的情况: 这种情况下代码混淆的方式相对简单: 1)只需 ...

  10. 解决EF使用context.Database.SqlQuery时NotMapped属性列为空null的问题(转载)

    有时候我们要为EF中的Model加一个新属性,这个属性不是数据库中的字段,而是从其它表中关联出来的.EF中要标示一个列不是对应表中字段只需要加上NotMapped特性.要使用NotMapped,保证你 ...