🐷
グラフ+BFS アルゴ式 スモール・ワールドを理解し忘れないようにする
問題概要
カメのアルルの通う学校には N 人の生徒がいます。 それぞれの生徒には 0 から N−1 までの番号が割り振られており、アルルの番号は 0 です。 N 人の交友関係は次の M 個であることがわかっている。
アルル(友達0)が交友関係をたどっていったときに、友達
基本設計
アルル(友達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;
}
参考サイト
Discussion