1114. Family Property (25)[并查集]

2023-12-02 15:58
文章标签 25 family 查集 property 1114

本文主要是介绍1114. Family Property (25)[并查集],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 原题: https://www.patest.cn/contests/pat-a-practise/1114

2. 思路:

题意:
找出同一个有关系的家庭里的人数,房产套数及总面积。
思路:
并查集或者dfs算法。
集合问题,并查集优先。


我是先把结点进行合并,
合并好后按照根结点值升序(因为s[i].parent是负值,绝对值是该集合的人数),同时累计该集合的套数及面积。
最后排序输出就好了。
注意:
合并的时候要把编号大的合并到小的那里去。
已AC。

3. 源码:

#include<iostream>
#include<algorithm>//使用sort函数
#include<vector>
using namespace std;struct Node
{Node() : id(-1), parent(-1), sets(0), area(0) {}//父结点初始化为-1,表示自己就是根bool operator<(const Node &b) const//重载比较运算符,先安装父结点值升序,再按照id降序。所以id初始为-1{if (parent != b.parent)return parent < b.parent;elsereturn id > b.id;}int id, parent, sets, area;//分别为结点号, 父结点号, 该人的套数, 面积double avg_area, avg_sets;//平均面积及套数
};
const int Max = 10000;//结点数最大值
Node s[Max];//下标映射结点号int find(int x);//并查集的查找根结点函数
void Union(int root1, int root2);//并查集的合并
bool cmp(const Node &a, const Node &b);//最后输出的排序int main(void)
{//freopen("in.txt", "r", stdin);int N;scanf("%d", &N);vector<Node> data(N);//存储现有结点数for (int i = 0; i < N; i++){vector<int> tnode;//存储每个id下有关系的人int t_id, f, m, k;//分别为当前编号, 父亲编号,目前编号, 孩子数scanf("%d %d %d %d", &t_id, &f, &m, &k);tnode.push_back(f);//插入数组tnode.push_back(m);for (int j = 0; j < k; j++){int child;scanf("%d", &child);tnode.push_back(child);}data[i].id = t_id;s[t_id].id = t_id;scanf("%d %d", &data[i].sets, &data[i].area);for (int j = 0; j < tnode.size(); j++)//对数组统一处理{if (tnode[j] != -1){s[tnode[j]].id = tnode[j];int root1 = find(t_id);int root2 = find(tnode[j]);Union(root1, root2);//合并}}}for (int i = 0; i < N; i++)//累计套数和面积{s[find(data[i].id)].area += data[i].area;s[find(data[i].id)].sets += data[i].sets;}sort(s, s + Max);//排序int cnt = 0;//集合数目vector<Node> re;//存储最终结果for (int i = 0; i < Max; i++){if (s[i].parent < 0 && s[i].id > -1)//计算有效的根结点{s[i].avg_area = (double)s[i].area / (-s[i].parent);s[i].avg_sets = (double)s[i].sets / (-s[i].parent);re.push_back(s[i]);cnt++;}elsebreak;}sort(re.begin(), re.end(), cmp);//对结果排序printf("%d\n", cnt);for (int i = 0; i < cnt; i++){printf("%04d %d %.3lf %.3lf\n", re[i].id, -re[i].parent, re[i].avg_sets,re[i].avg_area);}return 0;
}int find(int x)//并查集的查找根结点函数
{if (s[x].parent < 0)return x;elsereturn (s[x].parent = find(s[x].parent));//利用了路径压缩
}void Union(int root1, int root2)//并查集的合并
{if (root1 < root2)//大的合并到小的{s[root1].parent += s[root2].parent;s[root2].parent = root1;}else if (root2 < root1){s[root2].parent += s[root1].parent;s[root1].parent = root2;}
}bool cmp(const Node &a, const Node &b)//最后输出的排序
{if (a.avg_area != b.avg_area)return a.avg_area > b.avg_area;elsereturn a.id < b.id;
}


这篇关于1114. Family Property (25)[并查集]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/445933

相关文章

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

PS系统教程25

介绍软件 BR(bridge) PS 配套软件,方便素材整理、管理素材 作用:起到桥梁作用 注意:PS和BR尽量保持版本一致 下载和安装可通过CSDN社区搜索,有免费安装指导。 安装之后,我们打开照片只需双击照片,就自动在Ps软件中打开。 前提:电脑上有PS软件 三种预览格式 全屏预览 评星级 直接按数字键就可以 方向键可以更换图片 esc退出 幻灯片放

【团队成长】2024-25周周报-业务介绍内容创作

大家好!我们是IndustryOR 团队,致力于分享业界落地的算法技术。欢迎关注微信公众号/知乎/CSDN【运筹匠心】 。 记录人:张哲铭,某互联网大厂算法专家 【团队成长/个人成长】系列的推文会以 【工作周报】 的方式记录IndustryOR团队及其成员的成长过程,请大家一起见证和参与我们团队从0-1-N的发展过程。 记录人顺序:张哲铭-向杜兵-高欣甜-黄世鸿-许佳鸣

A bug‘s life 虫子的生活(带权并查集)

题目链接: 2492 -- A Bug's Life (poj.org) 题目描述: 思路: 带权并查集,处理方法基本与食物链(http://t.csdnimg.cn/fSnRr)相同,没什么思维创新 但是一开始WA了几次,有些细节没有注意好,还是需要静下心来,好好分析问题,需要警惕! 参考代码: //#include<bits/stdc++.h>#include<iostream

昇思25天学习打卡营第5天|网络构建

一、简介: 神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类(这个类和pytorch中的modul类是一样的作用),也是网络的基本单元。一个神经网络模型表示为一个Cell,它由不同的子Cell构成。使用这样的嵌套结构,可以简单地使用面向对象编程的思维,对神经网络结构进行构建和管理。

05-5.5.3 并查集的进一步优化

👋 Hi, I’m @Beast Cheng 👀 I’m interested in photography, hiking, landscape… 🌱 I’m currently learning python, javascript, kotlin… 📫 How to reach me --> 458290771@qq.com 喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会

昇思25天学习打卡营第5天 | 网络构建

内容介绍:神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个`Cell`,它由不同的子`Cell`构成。使用这样的嵌套结构,可以简单地使用面向对象编程的思维,对神经网络结构进行构建和管理。 具体内容: 1. 导包 import minds

昇思25天学习打卡营第4天 | 数据变换

内容介绍:通常情况下,直接加载的原始数据并不能直接送入神经网络进行训练,此时我们需要对其进行数据预处理。MindSpore提供不同种类的数据变换(Transforms),配合数据处理Pipeline来实现数据预处理。所有的Transforms均可通过`map`方法传入,实现对指定数据列的处理。 具体内容: 1. 导包 import numpy as npfrom PIL import Im

全网最全!25届最近5年上海理工大学自动化考研院校分析

上海理工大学 目录 一、学校+学院+专业简介 二、考试科目+指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、历年真题PDF 七、初试大纲+复试大纲 八、学费&奖学金&就业方向 一、学校+学院+专业简介 二、考试科目+指定教材 1、考试科目介绍 2、指定教材介绍 三、近5年考研分数情况

【Rust日报】 2019-05-25:Mockiato - 一個嚴格友好的Mock測試庫

Into The Wild 有人用rust寫了一個很像lf2(Little Fighter 2)的2.5D動作遊戲 Read more Rust官网的国际化支持,在找人翻译 Read more Read more 「讨论」对于单人主力维护的项目如何看待 楼主覺得 actix 和 rust-postgres 很棒 但發現這兩個庫都只有一個大佬在當主力開發,他覺得庫只有一人維護對大公司來