【图论】BFS

当边权为某个定值w时,可以直接把最短路改为经过w边几次,那么可以用bfs。

namespace BFS {

    const int MAXN = 3e5 + 10;

    int n;
    vector<int> G[MAXN];

    int dis[MAXN];
    queue<int> Q;

    void bfs(int s) {
        fill(dis + 1, dis + 1 + n, INF);
        while(!Q.empty())
            Q.pop();
        dis[s] = 0;
        Q.push(s);
        while(!Q.empty()) {
            int u = Q.front();
            Q.pop();
            for(int &v : G[u]) {
                if(dis[v] <= dis[u] + 1)
                    continue;
                dis[v] = dis[u] + 1;
                Q.push(v);
            }
        }
    }

}

也可以用01BFS,当边权为0或者某个定值w时,可以直接把最短路改为经过w边几次,那么可以用双端队列优化的bfs,当使用的边权值为0时,插入队首,否则插入队尾(或者直接用两个队列,有些检索那个代表距离为0的队列)

原文地址:https://www.cnblogs.com/purinliang/p/14387625.html