01bfs

这个实际上是一种求最短路的东西。是在边权只有 0 或 1 的有向图上求单源最短路。看起来很没用,但是相对好写。

其基础是双端队列。想法是由于边权只有 0 或 1,那么边权为 0 的边一定比边权为 1 的边更优(松弛没有代价),因此就放到前面先跑。复杂度 \(O(m)\)

可能有点拓展性?比如说开值域个队列之类的。那实际上好像与 dij 等价。实际上这个好像就是一个小号的 dij。

#define pii pair<int,int>
int s;

void bfs(){
    for(int i=1;i<=n;i++)dis[i]=inf;
    deque <int> t;dis[s]=0;t.push_front(s);
    while(!t.empty()){
        int u=t.front();t.pop_front();
        for(pii tmp:q[u]){
            int v=tmp.first,w=tmp.second;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                if(w)t.push_back(v);
                else t.push_front(v);
            }
        }
    }
}
posted @ 2025-06-23 15:49  all_for_god  阅读(13)  评论(0)    收藏  举报