結果
| 問題 |
No.416 旅行会社
|
| ユーザー |
|
| 提出日時 | 2016-08-26 23:17:43 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 2,155 ms / 4,000 ms |
| コード長 | 2,073 bytes |
| コンパイル時間 | 346 ms |
| コンパイル使用メモリ | 13,056 KB |
| 実行使用メモリ | 116,864 KB |
| 最終ジャッジ日時 | 2024-12-14 19:55:46 |
| 合計ジャッジ時間 | 21,448 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
class DisjointSet(object):
def __init__(self, n):
self.parent = list(range(n))
self.rank = [0] * n
def union(self, x, y):
self._link(self.find_set(x), self.find_set(y))
def _link(self, x, y):
if x == y:
return
if self.rank[x] > self.rank[y]:
self.parent[y] = x
else:
self.parent[x] = y
if self.rank[x] == self.rank[y]:
self.rank[y] += 1
def find_set(self, x):
xp = self.parent[x]
if xp != x:
self.parent[x] = self.find_set(xp)
return self.parent[x]
def read_data():
N, M, Q = map(int, input().split())
ABs = []
for m in range(M):
a, b = map(int, input().split())
ABs.append((a-1, b-1))
CDs = []
for q in range(Q):
c, d = map(int, input().split())
CDs.append((c-1, d-1))
return N, M, Q, ABs, CDs
def solve(N, M, Q, ABs, CDs):
Es = [set() for i in range(N)]
for a, b in ABs:
Es[a].add(b)
Es[b].add(a)
for c, d in CDs:
Es[c].remove(d)
Es[d].remove(c)
ds = DisjointSet(N)
for u in range(N):
for v in Es[u]:
ds.union(u, v)
ans = [0] * N
ans[0] = -1
update_ans(ans, 0, Es, -1)
val = Q
for c, d in CDs[::-1]:
rc = ds.find_set(c)
rd = ds.find_set(d)
r0 = ds.find_set(0)
if rc != rd:
if rc == r0:
update_ans(ans, rd, Es, val)
elif rd == r0:
update_ans(ans, rc, Es, val)
ds.union(c, d)
Es[c].add(d)
Es[d].add(c)
val -= 1
return ans
def update_ans(ans, root, Es, val):
'''
root に連結した頂点 v について、ans[v] = val とする。
'''
que = [root]
ans[root] = val
while que:
u = que.pop()
for v in Es[u]:
if not ans[v]:
ans[v] = val
que.append(v)
N, M, Q, ABs, CDs = read_data()
ans = solve(N, M, Q, ABs, CDs)
for k in ans[1:]:
print(k)