結果
問題 |
No.2200 Weird Shortest Path
|
ユーザー |
![]() |
提出日時 | 2025-03-20 20:51:45 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 959 ms / 2,000 ms |
コード長 | 1,321 bytes |
コンパイル時間 | 158 ms |
コンパイル使用メモリ | 82,448 KB |
実行使用メモリ | 141,308 KB |
最終ジャッジ日時 | 2025-03-20 20:52:17 |
合計ジャッジ時間 | 24,469 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 44 |
ソースコード
class UnionFind: def __init__(self, size): self.parent = list(range(size + 1)) # 1-based indexing self.size = [1] * (size + 1) def find(self, x): while self.parent[x] != x: self.parent[x] = self.parent[self.parent[x]] # Path compression x = self.parent[x] return x def union(self, x, y): fx = self.find(x) fy = self.find(y) if fx == fy: return False # Union by size: attach smaller tree to larger tree if self.size[fx] < self.size[fy]: fx, fy = fy, fx self.parent[fy] = fx self.size[fx] += self.size[fy] return True def main(): import sys input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr += 1 M = int(input[ptr]) ptr += 1 edges = [] for _ in range(M): a = int(input[ptr]) ptr += 1 b = int(input[ptr]) ptr += 1 w = int(input[ptr]) ptr += 1 edges.append((w, a, b)) edges.sort() uf = UnionFind(N) total = 0 for w, a, b in edges: fa = uf.find(a) fb = uf.find(b) if fa != fb: total += w * uf.size[fa] * uf.size[fb] uf.union(a, b) print(total) if __name__ == "__main__": main()