結果
問題 |
No.1776 Love Triangle 2 (Hard)
|
ユーザー |
![]() |
提出日時 | 2025-04-16 00:10:14 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 3,021 bytes |
コンパイル時間 | 150 ms |
コンパイル使用メモリ | 81,776 KB |
実行使用メモリ | 848,036 KB |
最終ジャッジ日時 | 2025-04-16 00:11:14 |
合計ジャッジ時間 | 4,315 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 4 MLE * 1 -- * 171 |
ソースコード
import sys from collections import deque def main(): input = sys.stdin.read().split() idx = 0 N = int(input[idx]); idx +=1 M = int(input[idx]); idx +=1 X = int(input[idx]); Y = int(input[idx+1]); Z = int(input[idx+2]); idx +=3 friends = [set() for _ in range(N+1)] for _ in range(M): a = int(input[idx]); b = int(input[idx+1]); idx +=2 friends[a].add(b) friends[b].add(a) # Build complement graph complement = [[] for _ in range(N+1)] for u in range(1, N+1): for v in range(1, N+1): if u != v and v not in friends[u]: complement[u].append(v) # BFS # state: (current_node, visited_nodes (set), mask, path) # mask: 0b00 (no Y/Z), 0b01 (Y), 0b10 (Z), 0b11 (both) min_length = None best_path = None initial_visited = set() queue = deque() queue.append( (X, initial_visited, 0, [X]) ) while queue: current, visited, mask, path = queue.popleft() if current == X and mask == 0b11 and len(path) >=4: # Check if valid valid = True for i in range(len(path)-1): u = path[i] v = path[i+1] if v in friends[u]: valid = False break # Check all nodes except X are unique seen = set() for node in path[1:-1]: if node in seen: valid = False break seen.add(node) if valid: k = len(path) -1 if (min_length is None) or (k < min_length) or (k == min_length and path < best_path): min_length = k best_path = path.copy() continue for neighbor in complement[current]: if neighbor == X: if len(path) >=3 and (neighbor not in path[1:-1]): new_mask = mask new_path = path + [neighbor] new_visited = visited.copy() # Check if Y and Z are in new_path has_Y = (Y in new_path) has_Z = (Z in new_path) if has_Y and has_Z: # Add to queue to check validity queue.append( (neighbor, new_visited, new_mask, new_path) ) continue if neighbor in visited: continue new_visited = visited.copy() new_visited.add(neighbor) new_mask = mask if neighbor == Y: new_mask |= 0b01 if neighbor == Z: new_mask |= 0b10 new_path = path + [neighbor] queue.append( (neighbor, new_visited, new_mask, new_path) ) if min_length is None: print(-1) else: print(min_length) print(' '.join(map(str, best_path))) if __name__ == '__main__': main()