結果
| 問題 |
No.416 旅行会社
|
| ユーザー |
はむ吉🐹
|
| 提出日時 | 2016-08-27 19:45:14 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 2,643 ms / 4,000 ms |
| コード長 | 2,435 bytes |
| コンパイル時間 | 240 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 104,580 KB |
| 最終ジャッジ日時 | 2024-12-14 20:03:38 |
| 合計ジャッジ時間 | 27,359 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
#!/usr/bin/env python3
import array
import collections
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)))
self.group = [{i} 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
self.group[y].update(self.group[x])
self.group[x].clear()
else:
self.par[y] = x
self.group[x].update(self.group[y])
self.group[y].clear()
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", (0 for _ in range(n)))
root = 0
for source, dest in rest_edges:
uf.unite(source, dest)
for i in range(1, n):
if uf.in_the_same_set(root, i):
con_time[i] = -1
for t, (source, dest) in enumerate(removed_edges[::-1]):
if not (uf.in_the_same_set(source, dest)):
is_same_s = uf.in_the_same_set(root, source)
is_same_d = uf.in_the_same_set(root, dest)
if not (is_same_s or is_same_d):
uf.unite(source, dest)
else:
if is_same_d:
source, dest = dest, source
for v in uf.group[uf.root(dest)]:
con_time[v] = q - t
uf.unite(source, dest)
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()
はむ吉🐹