[模板][HDU]P2544[单源最短路][SPFA]
题目就不放了,主要是写一下SPFA,很少写,今天特别学了一个用STL的队列来做的。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 inline int read(); 7 namespace lys{ 8 const int N = 1e2 + 7 ; 9 const int M = 1e4 + 7 ; 10 struct edge{ 11 int to; 12 int next; 13 int w; 14 }e[M*3]; 15 int n,m,cnt; 16 int pre[N],dis[N]; 17 bool exist[N]; 18 void add(int x,int y,int w){ 19 e[++cnt].to=y;e[cnt].next=pre[x];pre[x]=cnt;e[cnt].w=w; 20 e[++cnt].to=x;e[cnt].next=pre[y];pre[y]=cnt;e[cnt].w=w; 21 } 22 int spfa(){ 23 memset(dis,127,sizeof dis); 24 dis[1]=0; 25 queue <int> q; 26 q.push(1),exist[1]=true ; 27 int x,i,v; 28 while(!q.empty()){ 29 x=q.front(),q.pop(); 30 exist[x]=false ; 31 for(i=pre[x];i;i=e[i].next){ 32 v=e[i].to; 33 if(dis[x]+e[i].w<dis[v]){ 34 dis[v]=dis[x]+e[i].w; 35 if(!exist[v]) q.push(v); 36 } 37 } 38 } 39 return dis[n]; 40 } 41 int main(){ 42 int x,y,w; 43 while(true){ 44 n=read(); m=read(); 45 if(n==0) return 0; 46 memset(pre,0,sizeof pre); 47 cnt=0; 48 while(m--){ 49 x=read(); y=read(); w=read(); 50 add(x,y,w); 51 } 52 printf("%d\n",spfa()); 53 } 54 return 0; 55 } 56 } 57 int main(){ 58 lys::main(); 59 return 0; 60 } 61 inline int read(){ 62 int kk=0,ff=1; 63 char c=getchar(); 64 while(c<'0'||c>'9'){ 65 if(c=='-') ff=-1; 66 c=getchar(); 67 } 68 while(c>='0'&&c<='9') kk=kk*10+c-'0',c=getchar(); 69 return kk*ff; 70 }