hdu_2544_最短路(spfa版子)

題目連接:hdu_2544_最短路

存個自己寫的SPFA的板子

#include<cstdio>
#include<cstring>
#define mst(a,b) memset(a,b,sizeof(a))
#define F(i,a,b) for(int i=a;i<=b;i++)

const int N=10011,inf=1<<30;
int g[N],v[N*2],nxt[N*2],w[N*2],ed,d[N],in[N],cnt[N],Q[N];
inline void adg(int x,int y,int z){v[++ed]=y,w[ed]=z,nxt[ed]=g[x],g[x]=ed;}

bool spfa(int S,int n,int hd=1,int tl=0){//S爲源點,n爲點數
	F(i,0,n)d[i]=inf;
	mst(cnt,0),mst(in,0),cnt[S]=1,Q[++tl]=S,d[S]=0;
	for(int x,i;hd<=tl;)for(i=g[x=Q[hd++]],in[x]=0;i;i=nxt[i])
		if(d[v[i]]>d[x]+w[i]){
			d[v[i]]=d[x]+w[i];
			if(!in[v[i]]){
				in[v[i]]=1,d[v[i]]<d[Q[hd]]?Q[--hd]=v[i]:Q[++tl]=v[i];//SLF優化
				if(++cnt[v[i]]>n)return 0;//有負環
			}
		}
	return 1;
}

int n,m;
int main(){
	while(scanf("%d%d",&n,&m),n+m){
		mst(g,0),ed=0;
		int x,y,z;
		F(i,1,m)scanf("%d%d%d",&x,&y,&z),adg(x,y,z),adg(y,x,z);
		spfa(1,n),printf("%d\n",d[n]);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章