結果
問題 | No.416 旅行会社 |
ユーザー |
![]() |
提出日時 | 2023-05-30 01:48:30 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,606 ms / 4,000 ms |
コード長 | 3,270 bytes |
コンパイル時間 | 485 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 175,260 KB |
最終ジャッジ日時 | 2024-12-28 11:08:38 |
合計ジャッジ時間 | 14,266 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 21 |
ソースコード
from typing import Listclass UnionFind:"""0-indexed"""def __init__(self, n):self.n = nself.parent = [-1] * nself.__group_count = ndef unite(self, x, y) -> bool:"""xとyをマージ"""x = self.root(x)y = self.root(y)if x == y:return Falseself.__group_count -= 1if self.parent[x] > self.parent[y]:x, y = y, xself.parent[x] += self.parent[y]self.parent[y] = xreturn Truedef 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 xelse:# 経路圧縮あり# self.parent[x] = self.root(self.parent[x])# return self.parent[x]# 経路圧縮なしreturn self.root(self.parent[x])def size(self, x) -> int:"""xが属する連結成分のサイズを取得"""return -self.parent[self.root(x)]def all_sizes(self) -> List[int]:"""全連結成分のサイズのリストを取得 O(N)"""sizes = []for i in range(self.n):size = self.parent[i]if size < 0:sizes.append(-size)return sizesdef members(self, x) -> List[int]:"""xが属するグループのリストを返す O(N)"""mem = []r = self.root(x)for i in range(self.n):if self.root(i) == r:mem.append(i)return memdef groups(self) -> List[List[int]]:"""全連結成分の内容のリストを取得 O(N・α(N))"""groups = dict()for i in range(self.n):p = self.root(i)if not groups.get(p):groups[p] = []groups[p].append(i)return list(groups.values())@propertydef group_count(self) -> int:"""連結成分の数を取得 O(1)"""return self.__group_countimport sysinput = sys.stdin.readlineN,M,Q = map(int, input().split())edge = [list(map(int, input().split())) for _ in range(M)]query = []s = set()for i in range(Q):c,d = map(int, input().split())query.append([c,d])s.add((c,d))ans = [0]*Nuf = UnionFind(N)for a,b in edge:if (a,b) not in s:uf.unite(a-1,b-1)g = [list() for _ in range(N)]for i in range(N):g[uf.root(i)].append(i)for num in g[uf.root(0)]:ans[num] = -1for id,(c,d) in enumerate(query[::-1]):if uf.is_same(c-1,d-1):continuex,y = uf.root(c-1),uf.root(d-1)r0 = uf.root(0)uf.unite(c-1,d-1)r = uf.root(c-1)if r==x or (r==y and len(g[x])>len(g[y])):if y==r0:for v in g[x]:ans[v] = Q-idwhile g[y]:v = g[y].pop()g[x].append(v)if x==r0:ans[v] = Q-idelse:if x==r0:for v in g[y]:ans[v] = Q-idwhile g[x]:v = g[x].pop()g[y].append(v)if y==r0:ans[v] = Q-idprint(*ans[1:],sep='\n')