单源最短路

struct node{
    int id,dis;
    friend bool operator < (node x,node y){ //重载运算符 
    //<:bool类型,+:任何类型 
    //写参数,函数内写返回值 
        return x.dis>y.dis;
    }
};
priority_queue<node>q;
memset(dis,0x3f,sizeof(dis));
dis[1]=0; q,push({0,0});
while(!q.empty()){
    now = (q.top()).id; //把dis最小的点编号取出 
    q.pop(); //把dis最小的点编号取出 
    if(vis[now]) continue; //已经是黑点,不干了! 
    vis[now] = 1; //否则记录为黑点 
    for(int i = head[now];i;i=nxt[i]){
        if(dis[to[i]]>dis[now]+w[i]){  //如果和他相邻的点由这个点可以更小dis值 
            dis[to[i]]=dis[now]+w[i];  //更新 
            q.push({to[i],dis[to[i]]}); //压进堆里 
        }
    }
}



 SPFA算法:

每次从队列中取出队首点,尝试更新与其相连的点的dis

若成功将其入队

时间复杂度:最坏O(mn)

用途:负权边、判负环、最长路、差分约束、费用流

 

void spfa(){
    memset(dis,0x3f,sizeof(dis));
    dis[s] = 0;z[top+1] = s;  //起点为s 
    for(int j = 1;j <= top;j++){
        int now = z[j];vis[now] = 0;
        for(int i = head[now];i;i = nxt[i]){
            if(dis[to[i]] > dis[now] + w[i]){
                dis[to[i]] = dis[now] + w[i];
                if(!vis[to[i]]) vis[to[i]] = 1,z[++top] = to[i];
            }
        }
    }
    return;
}

 

posted @ 2022-02-10 16:37  yinfelix  阅读(28)  评论(0)    收藏  举报