单源最短路径,spfa
Posted shen-yu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单源最短路径,spfa相关的知识,希望对你有一定的参考价值。
SPFA又是一个好东西,看代码吧qwq
#include <cstdio> #include <cstring> #include <queue> #include <algorithm> #include <iostream> using namespace std; const int oo=2147483647; const int Maxn=500001; queue<int> q; int head[Maxn*2],nxt[Maxn*2],to[Maxn*2],w[Maxn*2]; int n,m,id,a,b,c; int dist[Maxn]; bool inq[Maxn]; int cnt; void add(int u,int v,int c)//加边了呢 { ++cnt; nxt[cnt]=head[u]; head[u]=cnt; to[cnt]=v; w[cnt]=c; } int main() { memset(inq,false,sizeof(inq)); cin>>n>>m>>id; for(int i=1; i<=m; i++) cin>>a>>b>>c,add(a,b,c); for(int i=1; i<=n; i++) dist[i]=oo; dist[id]=0; inq[id]=true; q.push(id); while(!q.empty()) { int u=q.front(); q.pop(); inq[u]=false; for(int v=head[u]; v; v=nxt[v]) { if(dist[to[v]]>dist[u]+w[v]) { //神奇的松弛操作了呢 dist[to[v]]=dist[u]+w[v]; if(inq[to[v]]==false) { inq[to[v]]=true; q.push(to[v]); } } } } for(int i=1; i<=n; i++) //没了,挺简单的 cout<<dist[i]<<‘ ‘; cout<<endl; return 0; }
可以用双端队列deque奥,不用了,懒得改了呢,qwq
以上是关于单源最短路径,spfa的主要内容,如果未能解决你的问题,请参考以下文章
SPFA板子 (背景:Luogu P3371 单源最短路径)