🐷

グラフ+BFS アルゴ式 スモール・ワールドを理解し忘れないようにする

2024/12/18に公開

https://algo-method.com/tasks/418

問題概要

カメのアルルの通う学校には N 人の生徒がいます。 それぞれの生徒には 0 から N−1 までの番号が割り振られており、アルルの番号は 0 です。 N 人の交友関係は次の M 個であることがわかっている。
アルル(友達0)が交友関係をたどっていったときに、友達iに最短経路で会うまでのたどる回数をd{\tiny i}とする。この中で最大値を出力する。

基本設計

アルル(友達0)が交友関係をたどっていったときに、友達iに最短経路で会うまでのたどる回数をd{\tiny i}とする。

友達0と直接繋がっている友達iを+1する。その後、+1した友達と直接繋がっている友達jをさらに+1する。これを可能な限り繰り返す。
一度メモした(+1した)マスは更新しないようにする。これによって、最短距離を求めることができる。
BFSを用いて、上記の設計をコードに落とし込む。
計算量は友達の人数N+紐づいている辺の数MでO(N+M)

提出コード

提出コード
// 省略

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

  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);
    }
  }
  
  int ans = 0;
  rep(i,n) ans = max(ans, dist[i]);
  cout << ans << endl;
  return 0;
}

参考サイト

https://qiita.com/drken/items/996d80bcae64649a6580

https://qiita.com/drken/items/4a7869c5e304883f539b

Discussion