
并查集!畅通工程 HDU 1232!
初始化并查集结构:每个城镇初始时自己是自己的父节点。 处理每条道路:对于每条道路,找到它连接的两个城镇的连通块,如果它们不同,就将这两个连通块合并。 统计连通块数量:最后统计连通块的数量,结果就是连通块数量减一。 UnionFind类:用于管理并查集操作,包括查找根节点和合并两个连通块。 读取输入:使用 处理每个测试用例:对于每个测试用例,初始化并查集结构,处理每条道路,并统计连通块数量。 统计连通块数目:通过遍历所有城镇,统计每个城镇的根节点,计算连通块数量。 输出结果:结果为连通块数量减一,即所需修建的最少道路数目。
发布日期:2021-05-08 21:10:59
浏览次数:18
分类:精选文章
本文共 1384 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要计算现有的道路连接形成了多少个连通块,然后用连通块数减一得到需要修的最少道路数目。我们可以使用并查集(Union-Find)数据结构来高效地管理和合并不同的连通块。
方法思路
解决代码
import sysclass UnionFind: def __init__(self, size): self.parent = list(range(size + 1)) # 城镇编号从1开始 def find(self, x): if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) return self.parent[x] def union(self, x, y): x_root = self.find(x) y_root = self.find(y) if x_root != y_root: self.parent[x_root] = y_rootdef main(): input = sys.stdin.read().split() ptr = 0 while ptr < len(input): n = int(input[ptr]) ptr += 1 if n == 0: break m = int(input[ptr]) ptr += 1 uf = UnionFind(n) for _ in range(m): a = int(input[ptr]) ptr += 1 b = int(input[ptr]) ptr += 1 uf.union(a, b) # 统计连通块数目 roots = set() for i in range(1, n + 1): roots.add(uf.find(i)) count = len(roots) print(count - 1)if __name__ == "__main__": main()
代码解释
sys.stdin.read()
读取所有输入,以提高处理大输入时的效率。发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月18日 22时21分10秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
微信js-sdk使用简述(分享,扫码功能等)
2019-03-05
c++中ifstream及ofstream超详细说明
2019-03-05
web项目配置
2019-03-05
基于单片机简易信号误差分析设计-全套资料
2019-03-05
基于单片机简易脉搏测量仪系统设计-毕设课设资料
2019-03-05
Javascript中String支持使用正则表达式的四种方法
2019-03-05
Servlet2.5的增删改查功能分析与实现------删除功能(四)
2019-03-05
spring启动错误:Could not resolve placeholder
2019-03-05
invalid byte sequence for encoding
2019-03-05
技术美术面试问题整理
2019-03-05
ORB-SLAM2:LoopClosing线程学习随笔【李哈哈:看看总有收获篇】
2019-03-05
js求阶乘
2019-03-05
Nginx---惊群
2019-03-05
项目中常用的审计类型概述
2019-03-05
(九)实现页面底部购物车的样式
2019-03-05
python-day3 for语句完整使用
2019-03-05
基于LabVIEW的入门指南
2019-03-05
weblogic之cve-2015-4852
2019-03-05