ABC369-Eを解いてみた

問題へのリンク

考察したこと

普通に$N<=400$だから、普通に考えられるのは、ワーシャルフロイド法だなと思った。 で橋を渡る部分は現在地を、取っておけば全然大丈夫だからこの部分はいい

ここで少し解説を見た、順列全探索を使用するみたい

あとはbit全探索使えばいいなと、思って実装したらACした。

ACコード

ライブラリは抜粋してあります

N, M = il()
G = create_array2(N, N, INF)
L = []

for i in range(N):
    G[i][i] = 0

for _ in [0] * M:
    u, v, t = il()
    u -= 1
    v -= 1

    G[u][v] = min(G[u][v], t)
    G[v][u] = min(G[v][u], t)

    L.append((u, v, t))

Q = ii()

for k in range(N):
    for cur in range(N):
        for nxt in range(N):
            G[cur][nxt] = min(G[cur][nxt], G[cur][k] + G[k][nxt])


def solve():
    K = ii()
    B = il(-1)

    result = INF

    for p in permutations(B):
        for bit in range(1 << K):
            cur = 0
            ans = 0
            for i in range(K):
                if bit & (1 << i):
                    ans += G[cur][L[p[i]][0]] + L[p[i]][2]
                    cur = L[p[i]][1]
                else:
                    ans += G[cur][L[p[i]][1]] + L[p[i]][2]
                    cur = L[p[i]][0]

            ans += G[cur][N - 1]
            result = min(result, ans)

    return result


for _ in [0] * Q:
    print(solve())

最後に

これの部分問題、キーエンス2024のDみたいな感じだったな この場合ワーシャルフロイドで拡張したけど、順列全探索+bit全探索は結構出てくるんだなって思った

Hugo で構築されています。
テーマ StackJimmy によって設計されています。