結果
問題 |
No.2290 UnUnion Find
|
ユーザー |
![]() |
提出日時 | 2023-07-26 00:20:31 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 643 ms / 2,000 ms |
コード長 | 1,655 bytes |
コンパイル時間 | 218 ms |
コンパイル使用メモリ | 82,048 KB |
実行使用メモリ | 143,872 KB |
最終ジャッジ日時 | 2024-10-02 17:03:17 |
合計ジャッジ時間 | 22,802 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 46 |
ソースコード
class UnionFind: """0-indexed""" def __init__(self, n): self.n = n self.parent = [-1] * n self.__group_count = n def unite(self, x, y) -> bool: """xとyをマージ""" x = self.root(x) y = self.root(y) if x == y: return False self.__group_count -= 1 if self.parent[x] > self.parent[y]: x, y = y, x self.parent[x] += self.parent[y] self.parent[y] = x return True def is_same(self, x, y) -> bool: """xとyが同じ連結成分か判定""" return self.root(x) == self.root(y) def root(self, x) -> int: """xの根を取得""" if self.parent[x] < 0: return x else: # 経路圧縮あり # self.parent[x] = self.root(self.parent[x]) # return self.parent[x] # 経路圧縮なし return self.root(self.parent[x]) import sys input = sys.stdin.readline N,Q = map(int, input().split()) d = {} s = set() uf = UnionFind(N) for i in range(N): d[uf.root(i)] = i s.add(i) for i in range(Q): q = list(map(int, input().split())) if q[0]==1: a,b = q[1]-1,q[2]-1 ra,rb = uf.root(a),uf.root(b) if ra==rb:continue uf.unite(a,b) rab = uf.root(a) if ra==rab: s.remove(d[rb]) else: s.remove(d[ra]) else: a = q[1]-1 if len(s)==1: print(-1) else: r = uf.root(a) for s_ in s: if s_!=d[r]: print(s_+1) break