結果
問題 | No.583 鉄道同好会 |
ユーザー | kohei2019 |
提出日時 | 2022-02-11 15:04:42 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,673 bytes |
コンパイル時間 | 164 ms |
コンパイル使用メモリ | 82,332 KB |
実行使用メモリ | 112,840 KB |
最終ジャッジ日時 | 2024-06-27 09:16:00 |
合計ジャッジ時間 | 5,491 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 45 ms
61,212 KB |
testcase_01 | AC | 43 ms
54,076 KB |
testcase_02 | AC | 44 ms
54,616 KB |
testcase_03 | AC | 42 ms
54,504 KB |
testcase_04 | AC | 47 ms
55,032 KB |
testcase_05 | AC | 44 ms
54,392 KB |
testcase_06 | AC | 45 ms
55,556 KB |
testcase_07 | AC | 43 ms
54,204 KB |
testcase_08 | AC | 44 ms
55,360 KB |
testcase_09 | AC | 42 ms
55,000 KB |
testcase_10 | AC | 46 ms
56,220 KB |
testcase_11 | AC | 108 ms
84,456 KB |
testcase_12 | AC | 122 ms
88,472 KB |
testcase_13 | AC | 122 ms
88,784 KB |
testcase_14 | AC | 121 ms
88,976 KB |
testcase_15 | AC | 138 ms
91,944 KB |
testcase_16 | AC | 191 ms
101,084 KB |
testcase_17 | AC | 219 ms
106,248 KB |
testcase_18 | TLE | - |
ソースコード
from collections import Counter # Edges := [Edge*] # Edge := (Vertex, Vertex) # Vertex := Hashable except None def solve_hitofude(edges): def _make_vertexcounter(edges): '各頂点ごとに、辺の数を数える' c = Counter() for x, y in edges: c[x] += 1 c[y] += 1 return c def _make_edgeflag(edges, value=True): '通った辺を管理するための辞書を作る' d = dict() for edge in edges: d[edge] = value return d def _get_head_tail(counter): '始点・終点を決める' odd = [] for k,v in counter.items(): if v&1: odd.append(k) if len(odd) == 2: return tuple(odd) elif len(odd) == 0: t = c.most_common(1)[0][0] return t, t else: return None, None def _edge_selector(pos, edgeflag): 'ジェネレータ関数。ある点につながっていて、まだ通ってない辺をyieldするジェネレータを作る。' for edge in edgeflag: if edgeflag[edge]: a, b = edge if a == pos: yield edge, b if edgeflag[edge] and b == pos: yield edge, a stack_pos = [] # 通った点を順に入れていく stack_edge = [] # 通った辺を入れていく stack_selector = [] # _edge_selectorジェネレータを入れていく c = _make_vertexcounter(edges) remain = _make_edgeflag(edges) pos, tail = _get_head_tail(c) if pos is None: return None n = len(edges) selector = _edge_selector(pos, remain) while n: # 全部の辺をたどったら終了 try: edge, nextpos = next(selector) except StopIteration: # 辿れる辺がなくなったら戻る。これ以上戻れない場合はNoneを返す。 if stack_pos: pos = stack_pos.pop() remain[stack_edge.pop()] = True selector = stack_selector.pop() n += 1 else: return None else: # 辿れる場合の処理。 stack_pos.append(pos) stack_edge.append(edge) stack_selector.append(selector) pos = nextpos remain[edge] = False selector = _edge_selector(pos, remain) n -= 1 if pos == tail: return stack_pos, stack_edge assert False N,M = map(int,input().split()) lsedg = [tuple(map(int,input().split())) for i in range(M)] print('NO' if solve_hitofude(lsedg)==None else 'YES')