1 条题解
-
0
思路与算法
从c做无向图BFS,得到每个人首次收到糖的传播距离d。若有未访问者,输出-1。否则最远距离为D,c在第1秒持糖,最远者第1+D秒收到,再花m秒吃完,答案是1+D+m。
正确性说明
每次沿边传播耗时1且同时向全部邻居传播,首次到达时间正是最短路距离加初始时刻1。所有人吃糖时间相同m,所以最晚完成者就是距离最远者。BFS按层正确得到这些最短距离,不可达者永远收不到糖,故-1。
复杂度
邻接表初始化O(n+p),BFS O(n+p),空间O(n+p)。计时与输出用64位整数,输入m和起始时刻都显式计入。
易错点
同一秒可向多个邻居发糖,不是逐个排队。已经收到者不重复接受。公开示例的解释人物编号有笔误,但按输入图最远距离2得到答案5。n=1,m=0时答案是1。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, p, c; long long m; cin >> n >> p >> c >> m; vector<vector<int>> g(n + 1); while (p--) { int a, b; cin >> a >> b; g[a].push_back(b); g[b].push_back(a); } vector<int> d(n + 1, -1); queue<int> q; q.push(c); d[c] = 0; int seen = 1, far = 0; while (q.size()) { int u = q.front(); q.pop(); for (int v : g[u]) if (d[v] < 0) { d[v] = d[u] + 1; far = max(far, d[v]); ++seen; q.push(v); } } cout << (seen == n ? 1LL + far + m : -1) << '\n'; }
- 1