Dijkstra

单源最短路,Dijkstra是基于贪心的思想,首先用dis[]记录源点到每个点的最短路径,再用一个数组保存已找到的最短路径的点,然后从dis中找最小值,该值则是源点到该值对应顶点的最短路径,并标记该店为已找到的最短路,选择最小值时,可以用线段树、平衡树、堆来进行优化,适用于无负权的图,时间复杂度O(N*log2(N))。

inline void dijkstra(int s){
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));/*初始化正无穷*/
    q.push({0,s});
    dis[s]=0;
    while(!q.empty()){
        int x=q.top().second;
        q.pop();
        if(vis[x])continue;/*标记过则不用访问*/
        vis[x]=1;/*标记*/
        for(int i=h[x];i;i=e[i].next){
            int y=e[i].to;
            if(dis[y]>dis[x]+e[i].w){/*松弛*/
                dis[y]=dis[x]+e[i].w;
                q.push({dis[y],y});/*直接入队,无需判断*/
            }
        }
    }
}
posted @ 2022-11-14 17:42  半步蒟蒻  阅读(128)  评论(0)    收藏  举报