結果

問題 No.1776 Love Triangle 2 (Hard)
ユーザー gew1fw
提出日時 2025-06-12 18:15:12
言語 PyPy3
(7.3.15)
結果
MLE  
実行時間 -
コード長 1,909 bytes
コンパイル時間 148 ms
コンパイル使用メモリ 82,116 KB
実行使用メモリ 849,424 KB
最終ジャッジ日時 2025-06-12 18:16:09
合計ジャッジ時間 8,247 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 4 MLE * 1 -- * 171
権限があれば一括ダウンロードができます

ソースコード

diff #

from collections import deque

n, m = map(int, input().split())
X, Y, Z = map(int, input().split())
friends = set()
for _ in range(m):
    a, b = map(int, input().split())
    friends.add((a, b))
    friends.add((b, a))

# Build adjacency list for non-friend pairs
adj = [[] for _ in range(n + 1)]
for u in range(1, n + 1):
    for v in range(1, n + 1):
        if u != v and (u, v) not in friends:
            adj[u].append(v)
    adj[u].sort()  # Ensure lex order

# BFS setup
visited = set()
queue = deque()
initial_mask = 1 << (X - 1)
queue.append((X, initial_mask, False, False, [X]))

found = False
answer_k = None
answer_path = None

while queue:
    current, mask, y_flag, z_flag, path = queue.popleft()
    
    for neighbor in adj[current]:
        if neighbor == X:
            if len(path) >= 3 and y_flag and z_flag:
                # Check if the cycle is valid (last step is non-friend)
                # Since neighbor is in adj[current], current and X are non-friends
                full_path = path + [X]
                k = len(path)
                if not found or k < answer_k or (k == answer_k and full_path < answer_path):
                    answer_k = k
                    answer_path = full_path
                    found = True
        else:
            if not (mask & (1 << (neighbor - 1))):
                new_mask = mask | (1 << (neighbor - 1))
                new_y = y_flag or (neighbor == Y)
                new_z = z_flag or (neighbor == Z)
                state = (neighbor, new_mask, new_y, new_z)
                if state not in visited:
                    visited.add(state)
                    new_path = path + [neighbor]
                    queue.append((neighbor, new_mask, new_y, new_z, new_path))
    if found:
        break  # Exit early if found to ensure lex order

if found:
    print(answer_k)
    print(' '.join(map(str, answer_path)))
else:
    print(-1)
0