1 条题解

  • 0
    @ 2026-10-27 13:20:34

    思路与算法

    从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

    信息

    ID
    2094
    时间
    1000ms
    内存
    64MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者