結果
| 問題 |
No.1776 Love Triangle 2 (Hard)
|
| ユーザー |
lam6er
|
| 提出日時 | 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()
lam6er