結果
問題 |
No.1776 Love Triangle 2 (Hard)
|
ユーザー |
![]() |
提出日時 | 2025-03-31 17:31:52 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 4,566 bytes |
コンパイル時間 | 141 ms |
コンパイル使用メモリ | 82,656 KB |
実行使用メモリ | 848,912 KB |
最終ジャッジ日時 | 2025-03-31 17:32:55 |
合計ジャッジ時間 | 9,772 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 4 MLE * 1 -- * 171 |
ソースコード
from collections import deque def main(): import sys input = sys.stdin.read().split() ptr = 0 N, M = int(input[ptr]), int(input[ptr+1]) ptr += 2 X = int(input[ptr]) Y = int(input[ptr+1]) Z = int(input[ptr+2]) ptr += 3 friends = [set() for _ in range(N + 1)] # Using 1-based index for _ in range(M): a = int(input[ptr]) b = int(input[ptr+1]) friends[a].add(b) friends[b].add(a) ptr += 2 allowed_adj = [[] for _ in range(N + 1)] for u in range(1, N + 1): allowed = [] for v in range(1, N + 1): if u != v and v not in friends[u]: allowed.append(v) allowed.sort() allowed_adj[u] = allowed start_visited = 1 << (X - 1) initial_path = [X] queue = deque() queue.append((X, start_visited, False, False, initial_path)) visited = dict() key = (X, start_visited, False, False) visited[key] = initial_path.copy() solution = None while queue: current_node, mask, has_y, has_z, path = queue.popleft() if current_node == X and len(path) > 1: if has_y and has_z: valid = True if path[-2] in friends[X]: valid = False else: for i in range(len(path) - 1): if path[i + 1] in friends[path[i]]: valid = False break if path[1] in friends[X]: valid = False if valid: full_path = path + [X] current_k = len(full_path) - 1 if solution is None or current_k < solution[0] or (current_k == solution[0] and full_path < solution[1]): solution = (current_k, full_path) if solution is not None: break if solution: continue if current_node == X and len(path) == 1: for next_node in allowed_adj[current_node]: if next_node == X: continue if (mask & (1 << (next_node - 1))): continue new_mask = mask | (1 << (next_node - 1)) new_has_y = has_y or (next_node == Y) new_has_z = has_z or (next_node == Z) new_path = path + [next_node] new_key = (next_node, new_mask, new_has_y, new_has_z) if new_key not in visited: visited[new_key] = new_path queue.append((next_node, new_mask, new_has_y, new_has_z, new_path)) else: for next_node in allowed_adj[current_node]: if next_node == X: if current_node in friends[X]: continue new_has_y = has_y new_has_z = has_z if not (new_has_y and new_has_z): continue new_path = path + [X] valid = True if path[1] in friends[X]: valid = False else: for i in range(len(new_path) - 1): u, v = new_path[i], new_path[i + 1] if v in friends[u]: valid = False break if valid: current_k = len(new_path) - 1 if solution is None or current_k < solution[0] or (current_k == solution[0] and new_path < solution[1]): solution = (current_k, new_path) break else: if (mask & (1 << (next_node - 1))): continue new_mask = mask | (1 << (next_node - 1)) new_has_y = has_y or (next_node == Y) new_has_z = has_z or (next_node == Z) new_path = path + [next_node] new_key = (next_node, new_mask, new_has_y, new_has_z) if new_key not in visited: visited[new_key] = new_path queue.append((next_node, new_mask, new_has_y, new_has_z, new_path)) if solution: print(solution[0]) print(' '.join(map(str, solution[1]))) else: print(-1) if __name__ == '__main__': main()