結果
問題 | No.2301 Namorientation |
ユーザー | LyricalMaestro |
提出日時 | 2024-09-14 06:07:02 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 861 ms / 3,000 ms |
コード長 | 2,210 bytes |
コンパイル時間 | 301 ms |
コンパイル使用メモリ | 82,312 KB |
実行使用メモリ | 159,584 KB |
最終ジャッジ日時 | 2024-09-14 06:07:25 |
合計ジャッジ時間 | 22,251 ms |
ジャッジサーバーID (参考情報) |
judge6 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 45 ms
53,972 KB |
testcase_01 | AC | 42 ms
54,272 KB |
testcase_02 | AC | 42 ms
53,888 KB |
testcase_03 | AC | 42 ms
53,632 KB |
testcase_04 | AC | 43 ms
54,144 KB |
testcase_05 | AC | 43 ms
53,888 KB |
testcase_06 | AC | 43 ms
53,888 KB |
testcase_07 | AC | 43 ms
54,144 KB |
testcase_08 | AC | 42 ms
53,504 KB |
testcase_09 | AC | 42 ms
53,888 KB |
testcase_10 | AC | 43 ms
53,888 KB |
testcase_11 | AC | 43 ms
54,020 KB |
testcase_12 | AC | 609 ms
116,152 KB |
testcase_13 | AC | 503 ms
113,184 KB |
testcase_14 | AC | 839 ms
148,792 KB |
testcase_15 | AC | 565 ms
119,920 KB |
testcase_16 | AC | 738 ms
134,212 KB |
testcase_17 | AC | 515 ms
116,612 KB |
testcase_18 | AC | 679 ms
134,728 KB |
testcase_19 | AC | 464 ms
107,688 KB |
testcase_20 | AC | 712 ms
134,464 KB |
testcase_21 | AC | 579 ms
118,960 KB |
testcase_22 | AC | 456 ms
145,848 KB |
testcase_23 | AC | 441 ms
145,156 KB |
testcase_24 | AC | 384 ms
129,260 KB |
testcase_25 | AC | 353 ms
134,920 KB |
testcase_26 | AC | 436 ms
159,584 KB |
testcase_27 | AC | 861 ms
147,516 KB |
testcase_28 | AC | 791 ms
148,192 KB |
testcase_29 | AC | 846 ms
147,052 KB |
testcase_30 | AC | 852 ms
147,460 KB |
testcase_31 | AC | 841 ms
148,416 KB |
ソースコード
## https://yukicoder.me/problems/no/2301 from collections import deque class UnionFind: """ UnionFindの基本的な処理を実装したクラス """ def __init__(self, size): self.root = [i for i in range(size)] self.size = [1] * size def get_root(self, v): if v == self.root[v]: return v else: old_root = self.root[v] new_root = self.get_root(old_root) self.root[v] = new_root return new_root def merge(self, u, v): root_u = self.get_root(u) root_v = self.get_root(v) if root_u == root_v: return False if self.size[root_u] >= self.size[root_v]: self.size[root_u] += self.size[root_v] self.root[root_v] = root_u self.root[v] = root_u else: self.size[root_v] += self.size[root_u] self.root[root_u] = root_v self.root[u] = root_v return True def main(): N = int(input()) edges = [] edges_map = {} for i in range(N): a, b = map(int, input().split()) edges.append((a - 1, b - 1)) edges_map[(a - 1, b - 1)] = i # union findを使って木の構成に邪魔なedgeを取り出す uf = UnionFind(N) next_edges = [[] for _ in range(N)] fales = [] for a, b in edges: if uf.merge(a, b): next_edges[a].append(b) next_edges[b].append(a) else: fales.append((a, b)) start = fales[0][0] parents = [-2] * N parents[start] = -1 queue = deque() queue.append(start) while len(queue) > 0: v = queue.popleft() for w in next_edges[v]: if w == parents[v]: continue parents[w] = v queue.append(w) parents[start] = fales[0][1] answers = ["" for _ in range(N)] for i in range(N): j = parents[i] if (i, j) in edges_map: answers[edges_map[(i, j)]] = "->" elif (j, i) in edges_map: answers[edges_map[(j, i)]] = "<-" for ans in answers: print(ans) if __name__ == "__main__": main()