并查集!畅通工程 HDU 1232!
发布日期: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()

    代码解释

  • UnionFind类:用于管理并查集操作,包括查找根节点和合并两个连通块。
  • 读取输入:使用sys.stdin.read()读取所有输入,以提高处理大输入时的效率。
  • 处理每个测试用例:对于每个测试用例,初始化并查集结构,处理每条道路,并统计连通块数量。
  • 统计连通块数目:通过遍历所有城镇,统计每个城镇的根节点,计算连通块数量。
  • 输出结果:结果为连通块数量减一,即所需修建的最少道路数目。
  • 上一篇:C - 食物链 并查集
    下一篇:圆桌会议 HDU - 1214

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年04月18日 22时21分10秒