結果
問題 | No.1612 I hate Construct a Palindrome |
ユーザー |
👑 ![]() |
提出日時 | 2021-07-21 22:52:34 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 449 ms / 2,000 ms |
コード長 | 3,866 bytes |
コンパイル時間 | 157 ms |
コンパイル使用メモリ | 82,524 KB |
実行使用メモリ | 142,352 KB |
最終ジャッジ日時 | 2024-07-17 19:56:29 |
合計ジャッジ時間 | 8,177 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 36 |
ソースコード
"""全部が同じ種類の辺なら不可能そうでないなら、2種類の文字を使うパスを見付けるあとは、半分を同じ文字で埋めるstart が 2色goal が2色ならそのうち使われなかった方を繰り返しに採用するそれ以外なら、適当に辺を持ってくる"""from sys import stdinimport sysfrom collections import dequeN,M = map(int,stdin.readline().split())#olis = [ [] for i in range(N) ]lis = [ [] for i in range(N) ]C = []AB = []for i in range(M):A,B,tC = stdin.readline().split()A = int(A)B = int(B)tC = ord(tC)A -= 1B -= 1C.append( tC )AB.append((A,B))lis[A].append( (B,i) )lis[B].append( (A,i) )#2色のパスを見付ける必要があるCset = set(C)if len(Cset) == 1:print (-1)sys.exit()sc = set()gc = set()for nex,ind in lis[0]:sc.add(C[ind])for nex,ind in lis[N-1]:gc.add(C[ind])sc = list(sc)gc = list(gc)if len(sc) > 1 or len(gc) > 1:dlis = [float("inf")] * Nplis = [i for i in range(N)]elis = [None] * Nq = deque([0])dlis[0] = 0while q:v = q.popleft()for nex,ind in lis[v]:if dlis[nex] > dlis[v] + 1:dlis[nex] = dlis[v] + 1plis[nex] = velis[nex] = indq.append(nex)ans = []nv = N-1while nv != 0:ans.append( elis[nv] )nv = plis[nv]if len(sc) > 1:fe = Nonefor nex,ind in lis[0]:if C[ind] != C[ans[-1]]:fe = indbreakwhile len(ans) + 2 <= 2*N:ans.append(fe)ans.append(fe)ans.reverse()for i in range(len(ans)):ans[i] += 1print (len(ans))print ("\n".join(map(str,ans)))sys.exit()else:ge = Noneans.reverse()for nex,ind in lis[0]:if C[ind] != C[ans[-1]]:ge = indbreakwhile len(ans) + 2 <= 2*N:ans.append(ge)ans.append(ge)for i in range(len(ans)):ans[i] += 1print (len(ans))print ("\n".join(map(str,ans)))sys.exit()else:lastc = gc[0]wante = Nonefor i in range(M):if C[i] != lastc:wante = ibreakwA,wB = AB[wante]dlis = [float("inf")] * Nplis = [i for i in range(N)]elis = [None] * Nq = deque([0])dlis[0] = 0while q:v = q.popleft()for nex,ind in lis[v]:if dlis[nex] > dlis[v] + 1:dlis[nex] = dlis[v] + 1plis[nex] = velis[nex] = indq.append(nex)zlast = wA if dlis[wA] < dlis[wB] else wBzans = []nv = zlastwhile nv != 0:zans.append(elis[nv])nv = plis[nv]zans.reverse()dlis = [float("inf")] * Nplis = [i for i in range(N)]elis = [None] * Nq = deque([N-1])dlis[N-1] = 0while q:v = q.popleft()for nex,ind in lis[v]:if dlis[nex] > dlis[v] + 1:dlis[nex] = dlis[v] + 1plis[nex] = velis[nex] = indq.append(nex)nlast = wA if dlis[wA] < dlis[wB] else wBnans = []nv = nlastwhile nv != N-1:nans.append(elis[nv])nv = plis[nv]if zlast == nlast:zans.append(wante)zans.append(wante)else:zans.append(wante)ans = zans + nanswhile len(ans) + 2 <= 2*N:ans.append(lis[N-1][0][1])ans.append(ans[-1])for i in range(len(ans)):ans[i] += 1print (len(ans))print ("\n".join(map(str,ans)))sys.exit()