spfa队列优化(用来求最短路)
实现方法:
1.存入图。可以使用链式前向星或者vocter。
2.开一个队列,先将开始的节点放入。
3.每次从队列中取出一个节点X,遍历与X相通的Y节点,查询比对 Y的长度 和 X的长度+ X与Y的长度
如果X的长度+ X与Y的长度 > Y的长度,说明需要更新操作。
1).存入最短路。
2).由于改变了原有的长度,所以需要往后更新,与这个节点相连的最短路。(即:判断下是否在队列,在就不用重复,不在就加入队列,等待更新)。
3).在这期间可以记录这个节点的进队次数,判断是否存在负环。
4.直到队空。
#include <iostream> #include <queue> #include <cstdio> #include <cstring> #define INF 2147483647 using namespace std; queue<int> q; struct littlestar { int to; int nxt; int w; }star[500005]; int head[500005]; int cnt=0; void add(int u,int v,int w) { star[++cnt].to=v; star[cnt].w=w; star[cnt].nxt=head[u]; head[u]=cnt; } int d[10005],v[10005]; void spfa(int u) { d[u]=0; v[u]=1; q.push(u); while(q.size()) { int x=q.front(); q.pop(); v[x]=0; for(int i=head[x];i;i=star[i].nxt) { int y=star[i].to,z=star[i].w; if(d[y]>d[x]+z) { d[y]=d[x]+z; if(!v[x]) { q.push(y); v[y]=1; } } } } } int main () { int n,m,s; cin>>n>>m>>s; for(int i=1;i<=n;i++) { d[i]=INF; } for(int i=1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); } spfa(s); for(int i=1;i<=n;i++) { cout<<d[i]<<" "; } }