本文共 1960 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要找到最低成本的方法,使得所有城镇通过公路连接。这个问题可以用最小生成树算法来解决,具体使用Kruskal算法来选择尽可能少成本的边。
import sysclass UnionFind: def __init__(self, n): self.parent = list(range(n + 1)) self.rank = [1] * (n + 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: return False # Already in the same set # Merge smaller rank into larger rank if self.rank[x_root] > self.rank[y_root]: self.parent[y_root] = x_root else: self.parent[x_root] = y_root if self.rank[x_root] == self.rank[y_root]: self.rank[y_root] += 1 return Truedef main(): input = sys.stdin.read().split() idx = 0 n = int(input[idx]) idx += 1 m = int(input[idx]) idx +=1 edges = [] for _ in range(m): u = int(input[idx]) idx +=1 v = int(input[idx]) idx +=1 w = int(input[idx]) idx +=1 edges.append( (w, u, v) ) edges.sort() uf = UnionFind(n) total = 0 count = 0 for (w, u, v) in edges: if uf.find(u) != uf.find(v): uf.union(u, v) total += w count += 1 if count == n -1: break if count == n -1: print(total) else: print(-1)if __name__ == "__main__": main()
这个方法确保了在最低成本的情况下连接所有城镇,使用了Kruskal算法的高效性和可靠性。
转载地址:http://wcoez.baihongyu.com/