結果
問題 |
No.2200 Weird Shortest Path
|
ユーザー |
![]() |
提出日時 | 2023-03-09 06:36:34 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 340 ms / 2,000 ms |
コード長 | 1,283 bytes |
コンパイル時間 | 233 ms |
コンパイル使用メモリ | 82,824 KB |
実行使用メモリ | 86,084 KB |
最終ジャッジ日時 | 2024-09-18 02:48:29 |
合計ジャッジ時間 | 11,185 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge6 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 44 |
ソースコード
class UnionFind: def __init__(self, n): self.n = n self.parent_or_size = [-1] * n def merge(self, a, b): x = self.root(a) y = self.root(b) if x == y: return False if -self.parent_or_size[x] < -self.parent_or_size[y]: x, y = y, x self.parent_or_size[x] += self.parent_or_size[y] self.parent_or_size[y] = x return True def same(self, a, b): return self.root(a) == self.root(b) def root(self, a): if self.parent_or_size[a] < 0: return a self.parent_or_size[a] = self.root(self.parent_or_size[a]) return self.parent_or_size[a] def size(self, a): return -self.parent_or_size[self.root(a)] N, M = map(int, input().split()) uf = UnionFind(N) def valtotuple(val: int): a = val % N val //= N b = val % N c = val // N return c, a, b def tupletoval(tup) -> int: c, a, b = tup return c * N * N + a * N + b es = [] for i in range(M): a, b, c = map(int, input().split()) es.append(tupletoval((c, a - 1, b - 1))) es.sort() ans = 0 for val in es: c, a, b = valtotuple(val) if not uf.same(a, b): ans += c * uf.size(a) * uf.size(b) uf.merge(a, b) print(ans)