单源最短路
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; }
浙公网安备 33010602011771号