結果
問題 | No.2301 Namorientation |
ユーザー |
![]() |
提出日時 | 2023-05-13 10:46:20 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,475 bytes |
コンパイル時間 | 165 ms |
コンパイル使用メモリ | 82,048 KB |
実行使用メモリ | 203,428 KB |
最終ジャッジ日時 | 2024-11-29 04:52:42 |
合計ジャッジ時間 | 84,733 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 8 WA * 2 TLE * 20 |
ソースコード
# N頂点N辺グラフは1閉路を含むので、閉路になるまでは1方向、そこから1周させればいい# 次数0の点があれば、そこから閉路まで閉路方向# 次数0の点がなければ、ただ1周すればいい# 昨日は実装失敗した、閉路上で方向を付けるときのスタート確定で失敗したN = int(input())edge_dic = {}edge_list = []edges = [[] for i in range(N+1)]degree = [0]*(N+1)for i in range(N):a, b = map(int, input().split())edge_list.append((a, b))edge_dic[(a, b)] = i+1edges[a].append(b)edges[b].append(a)degree[a] += 1degree[b] += 1degone = []for i in range(1, N+1):if degree[i] == 1:degone.append(i)# まず閉路を確定させるfrom collections import dequeque = deque()for v in degone:que.append((v, 0))degree[v] -= 1while que:current, prev = que.popleft()#print('current', current, 'prev', prev, degree)for nxt in edges[current]:if nxt != prev:degree[nxt] -= 1if degree[nxt] == 1:que.append((nxt, current))#print(degree)circuit = []for i in range(1, N+1):if degree[i] >= 2:circuit.append(i)#print(circuit)circuit_set = set(circuit)que2 = deque()for v in degone:for i in range(N):a, b = edge_list[i]if a == v:last = astart = bque2.append((start, last))breakelif b == v:last = bstart = aque2.append((start, last))break#print('que2', que2)ans_list = [0]*(N+1)while que2:current, prev = que2.popleft()#print('current', current, 'prev', prev)if (current, prev) in edge_dic:if ans_list[edge_dic[(current, prev)]] == 0:ans_list[edge_dic[(current, prev)]] = -1else:passelif (prev, current) in edge_dic:if ans_list[edge_dic[(prev, current)]] == 0:ans_list[edge_dic[(prev, current)]] = +1else:passif current not in circuit:for nxt in edges[current]:if nxt != prev:que2.append((nxt, current))# 今度は閉路の辺に方向を付けるque3 = deque()for i in range(N):a, b = edge_list[i]# ここでWAした、a, b両方とも閉路上が必要if a in circuit_set and b in circuit_set:if a == circuit[0]:last = astart = bque3.append((start, last))breakelif b == circuit[0]:last = bstart = aque3.append((start, last))break#print(que3)while que3:current, prev = que3.popleft()#print('current', current, 'prev', prev)if (current, prev) in edge_dic:if ans_list[edge_dic[(current, prev)]] == 0:ans_list[edge_dic[(current, prev)]] = -1else:breakelif (prev, current) in edge_dic:if ans_list[edge_dic[(prev, current)]] == 0:ans_list[edge_dic[(prev, current)]] = +1else:breakfor nxt in edges[current]:if nxt != prev and nxt in circuit:que3.append((nxt, current))#print(ans_list)for i in range(1, N+1):if ans_list[i] == 1:print('->')elif ans_list[i] == -1:print('<-')else:print('not determined')