hdu_2544_最短路(spfa版子)
题目连接:hdu_2544_最短路
存个自己写的SPFA的板子
1 #include<cstdio> 2 #include<cstring> 3 #define mst(a,b) memset(a,b,sizeof(a)) 4 #define F(i,a,b) for(int i=a;i<=b;i++) 5 6 const int N=10011,inf=1<<30; 7 int g[N],v[N*2],nxt[N*2],w[N*2],ed,d[N],in[N],cnt[N],Q[N]; 8 inline void adg(int x,int y,int z){v[++ed]=y,w[ed]=z,nxt[ed]=g[x],g[x]=ed;} 9 10 bool spfa(int S,int n,int hd=1,int tl=0){//S为源点,n为点数 11 F(i,0,n)d[i]=inf; 12 mst(cnt,0),mst(in,0),cnt[S]=1,Q[++tl]=S,d[S]=0; 13 for(int x,i;hd<=tl;)for(i=g[x=Q[hd++]],in[x]=0;i;i=nxt[i]) 14 if(d[v[i]]>d[x]+w[i]){ 15 d[v[i]]=d[x]+w[i]; 16 if(!in[v[i]]){ 17 in[v[i]]=1,d[v[i]]<d[Q[hd]]?Q[--hd]=v[i]:Q[++tl]=v[i];//SLF优化 18 if(++cnt[v[i]]>n)return 0;//有负环 19 } 20 } 21 return 1; 22 } 23 24 int n,m; 25 int main(){ 26 while(scanf("%d%d",&n,&m),n+m){ 27 mst(g,0),ed=0; 28 int x,y,z; 29 F(i,1,m)scanf("%d%d%d",&x,&y,&z),adg(x,y,z),adg(y,x,z); 30 spfa(1,n),printf("%d\n",d[n]); 31 } 32 return 0; 33 }