公式

D - 道しるべを置いて誘導せよ / Place Signposts to Guide the Way 解説 by harurun4635


バリケードがある交差点を通らないで交差点 \(N\) から交差点 \(1\) まで行く最短経路を求めればよいです。

この距離を \(D\) としたとき、 \(D\) 個で可能なのは明らかです。なぜならば、交差点 \(N\) 以外の最短経路の頂点の上に「道しるべ」をおけば良いからです。

また、 \(D\) 個以上必要なのも明らかです。バリケードがある頂点に子猫が到達する方法はありませんから、子猫の移動回数は \(D\) を下回る事はなく、子猫の移動回数以上の道しるべが必要だからです。


実装例

n, m, k = map(int, input().split())
g = [[] for i in range(n)]
for i in range(m):
    u, v = map(int, input().split())
    g[u-1].append(v-1)
    g[v-1].append(u-1)

que = [n-1]
d = [-1] * n
d[n-1] = 0

b = list(map(int, input().split()))
for x in b:
    d[x-1] = -2

for u in que:
    for v in g[u]:
        if d[v] == -1:
            d[v] = d[u] + 1
            que.append(v)

print(d[0])

投稿日時:
最終更新: