1 条题解

  • 0
    @ 2026-3-16 10:47:00

    文字教学

    这道题是无权无向图的多源最短路径问题,用反向BFS高效解决:

    1. 反向思考:因为要算所有点到N的最短距离,直接从N出发做一次BFS,就能一次性算出所有点的最短路径(边权为1时BFS天然求最短)。
    2. 建图:用邻接表存储无向图,每条边双向添加。
    3. BFS初始化:距离数组dist初始化为-1(不可达),起点N的距离设为0并入队。
    4. 扩展过程:每次取出队首节点,遍历邻接点,若未访问则更新距离并入队。
    5. 输出:按顺序输出1到N-1的距离。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 105;
    vector<int> adj[N];
    int dist[N];
    queue<int> q;
    
    int main() {
        int n, m;
        cin >> n >> m;
        for (int i = 0; i < m; ++i) {
            int s, e;
            cin >> s >> e;
            adj[s].push_back(e);
            adj[e].push_back(s);
        }
        memset(dist, -1, sizeof(dist));
        dist[n] = 0;
        q.push(n);
        while (!q.empty()) {
            int u = q.front();
            q.pop();
            for (int v : adj[u]) {
                if (dist[v] == -1) {
                    dist[v] = dist[u] + 1;
                    q.push(v);
                }
            }
        }
        for (int i = 1; i <= n-1; ++i) {
            cout << dist[i] << " ";
        }
        cout << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    11950
    时间
    1000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    1
    已通过
    1
    上传者