🐕

有向グラフ+BFS アルゴ式 s-t パスの存在判定を理解し忘れないようにする

2024/12/22に公開

https://algo-method.com/tasks/13994BE4

問題概要

有向グラフが存在する。
頂点sを始点(ルート)とした際に頂点tに辿り着くことができるか?

基本設計

最短経路を求める問題ではないのでBFS、DFSどちらを使っても良い。
今回は慣れているBFSを使用する。

頂点sを始点とし、通常のBFSを行う。探索終了後、頂点tを通ったことを確認すればいい。

提出コード

https://algo-method.com/tasks/13994BE4/submissions/1620293

提出コード

#include <iostream>
#include <vector>
#include <math.h>
#include <stdio.h>
#include <algorithm>
#include <set>
#include <regex>
#include <iomanip>
#include <map>
#include <cassert>
#include <stack>
#include <queue>
#include <deque>
#include <numeric>
using namespace std;
using ll = long long;
template<class T> using P = pair<T, T>;
template<typename T> bool chmax(T &a, T b) { return ((a < b) ? (a = b, true) : (false)); }
template<typename T> bool chmin(T &a, T b) { return ((a > b) ? (a = b, true) : (false)); }
using G = vector<vector<int>>;
#define rep(i, n) for (int i = 0; i < n; i++)
#define rrep(i,j, n) for (int i = j; i < n; i++)
#define all(x) (x).begin(), (x).end()
const double PI = acos(-1);

int main()
{
  int n,m,s,t;
  cin >> n >> m >> s >> t;
  G g(n);
  rep(i,m) {
    int a,b;
    cin >> a >> b;
    g[a].push_back(b);
  }
  vector<int> dist(n,-1);
  queue<int> que;
  dist[s] = 0;
  que.push(s);

  while (!que.empty())
  {
    int v = que.front();
    que.pop();
    for(int next_v: g[v]) {
        if (dist[next_v] != -1) continue;
        dist[next_v] = dist[v] + 1;
        que.push(next_v);
    }
  }
  if (dist[t] == -1) cout << "No" << endl;
  else cout << "Yes" << endl;
  return 0;
}

Discussion