公式
C - うわさの伝播 / Spread of Rumors 解説
by
C - うわさの伝播 / Spread of Rumors 解説
by
kyopro_friends
この問題は BFS により解くことができます。
人を頂点、連絡手段を辺としたグラフを考えると、人 \(S\) に対応する頂点から最も遠い頂点までの距離が答えとなります。よって、人 \(S\) に対応する頂点から各頂点までの距離が分かればよく、BFS により求めることができます。
実装例 (C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, m, s;
cin >> n >> m >> s;
s--;
vector<vector<int>>G(n);
for(int i=0; i<m; i++){
int u, v;
cin >> u >> v;
u--, v--;
G[u].push_back(v);
}
const int INF = (int)1e9;
vector<int> dist(n, INF);
queue<int> q({s});
dist[s] = 0;
while(q.size() > 0){
int v = q.front(); q.pop();
for(auto vv: G[v]){
if(dist[vv] == INF){
dist[vv] = dist[v] + 1;
q.push(vv);
}
}
}
int ans = *max_element(dist.begin(), dist.end());
if(ans == INF){
cout << -1 << endl;
}else{
cout << ans << endl;
}
}
実装例 (Python)
N, M, S = map(int, input().split())
S -= 1
G = [[] for _ in range(N)]
for _ in range(M):
U, V = map(int, input().split())
U -= 1
V -= 1
G[U].append(V)
INF = 10**9
dist = [INF] * N
q = [S]
dist[S] = 0
for v in q:
for vv in G[v]:
if dist[vv] == INF:
dist[vv] = dist[v] + 1
q.append(vv)
ans = max(dist)
if ans == INF:
print(-1)
else:
print(ans)
投稿日時:
最終更新:
