老是忘,简单记录一下吧。

介绍

一个边权仅为 $0,1$ 的图中跑最短路可以直接用 bfs。

维护一个 deque,每次更新 dis[v] 时就将 v push进去,如果 w(u,v) == 0 就push到前面,否则push到后面。

vector<pii> adj[maxn];  // (v, w)
int dis[maxn];
bool vis[maxn];
void bfs01(int x) {
    deque<int> q;
    q.push_back(x);
    memset(dis, 63, sizeof(dis));
    memset(vis, 0, sizeof(vis));
    dis[x] = 0;
    while (!q.empty()) {
        int u = q.front(); q.pop_front();
        if (vis[u]) continue;
        vis[u] = 1;
        for (pii p : adj[u]) {
            int v = p.first, w = p.second;
            if (dis[u] + w < dis[v]) {
                dis[v] = dis[u] + w;
                if (w == 1) q.push_back(v);
                else q.push_front(v);
            }
        }
    }
}