Official
C - 通行止めの迂回路 / Detour for Road Closure Editorial
by
C - 通行止めの迂回路 / Detour for Road Closure Editorial
by
kyopro_friends
予め \(S_i=0\) の辺を無視してグラフを構築し、BFS を行えばよいです。計算量は \(O(N+M)\) です。
実装例 (C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, m;
cin >> n >> m;
vector<vector<int>> G(n);
for(int i=0; i<m; i++){
int u, v, s;
cin >> u >> v >> s;
if(s == 0){
continue;
}
u--, v--;
G[u].push_back(v);
G[v].push_back(u);
}
int INF = 1e9;
vector<int> dist(n, INF);
dist[0] = 0;
queue<int> q({0});
while(q.size() > 0){
int v = q.front(); q.pop();
for(int vv: G[v]){
if(dist[vv] == INF){
dist[vv] = dist[v] + 1;
q.push(vv);
}
}
}
if(dist[n-1] == INF){
cout << -1 << endl;
}else{
cout << dist[n-1] << endl;
}
}
実装例 (Python)
N, M = map(int, input().split())
G = [[] for _ in range(N)]
for _ in range(M):
U, V, S = map(int, input().split())
if S == 0:
continue
U -= 1
V -= 1
G[U].append(V)
G[V].append(U)
INF = 10**9
dist = [INF]*N
dist[0] = 0
q = [0]
for v in q:
for vv in G[v]:
if dist[vv] == INF:
dist[vv] = dist[v] + 1
q.append(vv)
if dist[-1] == INF:
print(-1)
else:
print(dist[-1])
posted:
last update:
