SPAF
Posted adventurer-h
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPAF相关的知识,希望对你有一定的参考价值。
#include<bits/stdc++.h> #define re register using namespace std; const int N(100001); const int M(200001); const int INF(0x7fffffff); struct f1{ int v; int w; int nxt; }e[M]; int n,m,s,cnt; int head[N],dist[N],vis[N];//vis记录是否在队列里 struct node{ int d; int u; node(int d1,int u1):d(d1),u(u1){}; }; bool operator > (const node &a,const node &b){ return a.d>b.d; } priority_queue<node,vector<node>,greater<node> >q; int read(){ int X=0,flag=1; char ch=getchar(); while(ch>‘9‘||ch<‘0‘) { if(ch==‘-‘) flag=-1; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘) X=X*10+ch-48,ch=getchar(); return X*flag; } void add(int u,int v,int w){ e[++cnt].v=v; e[cnt].w=w; e[cnt].nxt=head[u]; head[u]=cnt; } void get(){ n=read(),m=read(),s=read(); for(re int i=1;i<=m;++i){ int u=read(),v=read(),w=read(); add(u,v,w); } } void SPFA(){ for(re int i=1;i<=n;++i) dist[i]=INF; dist[s]=0; q.push(node(dist[s],s)); while(!q.empty()){ node f=q.top();q.pop(); int u=f.u; vis[u]=0; for(re int i=head[u];i;i=e[i].nxt){ if(dist[e[i].v]>dist[u]+e[i].w){ dist[e[i].v]=dist[u]+e[i].w; if(!vis[e[i].v]) q.push(node(dist[e[i].v],e[i].v)),vis[e[i].v]=1; } } } } int main(){ get(); SPFA(); for(re int i=1;i<=n;++i) printf("%d ",dist[i]); return 0; }
以上是关于SPAF的主要内容,如果未能解决你的问题,请参考以下文章
最短路(floyd/dijkstra/bellmanford/spaf 模板)