結果
| 問題 |
No.416 旅行会社
|
| コンテスト | |
| ユーザー |
はむ吉🐹
|
| 提出日時 | 2016-08-26 23:12:58 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,110 bytes |
| コンパイル時間 | 168 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 128,564 KB |
| 最終ジャッジ日時 | 2024-11-08 09:46:26 |
| 合計ジャッジ時間 | 11,039 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | TLE * 1 -- * 20 |
ソースコード
#!/usr/bin/env pypy3
import array
import collections
UNDEF = -2
Edge = collections.namedtuple("Edge", "source dest")
class UnionFind(object):
def __init__(self, number_of_nodes): # 初期化
self.par = array.array("L", range(number_of_nodes))
self.rank = array.array("L", (0 for i in range(number_of_nodes)))
def root(self, node): # 根を求める
if self.par[node] == node:
return node
else:
r = self.root(self.par[node])
self.par[node] = r # 経路圧縮
return r
def in_the_same_set(self, node1, node2): # 同じ集合に属するか
return self.root(node1) == self.root(node2)
def unite(self, node1, node2): # 属する集合を併合
x = self.root(node1)
y = self.root(node2)
if x == y:
pass
elif self.rank[x] < self.rank[y]:
self.par[x] = y
else:
self.par[y] = x
if self.rank[x] == self.rank[y]:
self.rank[x] += 1
def solve(n, q, all_edges, removed_edges):
rest_edges = set(all_edges) - set(removed_edges)
uf = UnionFind(n)
con_time = array.array("l", (UNDEF for _ in range(n)))
for source, dest in rest_edges:
uf.unite(source, dest)
for i in range(1, n):
if uf.in_the_same_set(0, i):
con_time[i] = -1
for t, (source, dest) in enumerate(reversed(removed_edges)):
uf.unite(source, dest)
for i in range(1, n):
if con_time[i] == UNDEF and uf.in_the_same_set(0, i):
con_time[i] = q - t
for i in range(1, n):
if not uf.in_the_same_set(0, i):
con_time[i] = 0
return con_time
def main():
n, m, q = map(int, input().split())
all_edges = [Edge(*(int(x) - 1 for x in input().split()))
for _ in range(m)]
removed_edges = [Edge(*(int(x) - 1 for x in input().split()))
for _ in range(q)]
ans = solve(n, q, all_edges, removed_edges)
print(*map(str, ans[1:]), sep="\n")
if __name__ == '__main__':
main()
はむ吉🐹