公式

C - 通行止めの迂回路 / Detour for Road Closure 解説 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])

投稿日時:
最終更新: