01BFS 最短路
Contents
老是忘,简单记录一下吧。
介绍
一个边权仅为 $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);
}
}
}
}