結果
| 問題 |
No.2948 move move rotti
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-11-03 19:43:14 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,507 ms / 4,000 ms |
| コード長 | 1,327 bytes |
| コンパイル時間 | 493 ms |
| コンパイル使用メモリ | 82,440 KB |
| 実行使用メモリ | 204,548 KB |
| 最終ジャッジ日時 | 2024-11-03 19:43:30 |
| 合計ジャッジ時間 | 14,294 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 |
ソースコード
# 各頂点について、その頂点に行くまでに通過した頂点の集合を記録する(bitDP)
# これによって、各頂点について何ターン目にその頂点に到達できるかを求めることができる
N, M, K = map(int, input().split())
X = set(list(map(int, input().split())))
G = [[] for _ in range(N)]
for _ in range(M):
u, v = map(int, input().split())
G[u - 1].append(v - 1)
G[v - 1].append(u - 1)
def turns_to_reach_vertices(x):
"""
頂点xから各頂点に何ターン目に到達できるかを求める
"""
dp = [[False] * N for _ in range(1 << N)]
dp[1 << x][x] = True
dist = [[] for _ in range(N)]
for S in range(1 << N):
for v in range(N):
if not dp[S][v]:
continue
for u in G[v]:
if S >> u & 1:
continue
dp[S | 1 << u][u] = True
for S in range(1 << N):
for v in range(N):
if dp[S][v]:
dist[v].append(bin(S).count("1") - 1)
dist = [set(d) for d in dist]
return dist
# 各頂点で出会えるか?
ok = [set(range(N)) for _ in range(N)]
for x in X:
k = turns_to_reach_vertices(x - 1)
for v in range(N):
ok[v] &= k[v]
print("Yes" if any(len(o) >= 1 for o in ok) else "No")