spfa的模板,但是,是用邻接表存边的,但是邻接表神物,不懂邻接表的可以去看我的邻接表随笔
1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define xx 10005 7 #define INF 0x2fffffff 8 queue<int>que; 9 int t,pre[xx];//边标号,表头; 10 int dis[xx],inque[xx]; 11 struct node 12 { 13 int st,nd,ln,next; 14 }edge[xx]; 15 void addedge(int st,int nd,int ln) 16 { 17 edge[t].st=st; 18 edge[t].nd=nd; 19 edge[t].ln=ln; 20 edge[t].next=pre[st]; 21 pre[st]=t++; 22 } 23 void spfa(int n) 24 { 25 int i,u,v; 26 while(!que.empty()) 27 que.pop(); 28 fill(dis,dis+xx,INF); 29 memset(inque,0,sizeof(inque)); 30 inque[1]=1; 31 dis[1]=0; 32 que.push(1); 33 while(!que.empty()) 34 { 35 u=que.front(); 36 que.pop(); 37 inque[u]=0; 38 for(i=pre[u];i+1;i=edge[i].next) 39 { 40 v=edge[i].nd; 41 if(dis[v]>dis[u]+edge[i].ln) 42 { 43 dis[v]=dis[u]+edge[i].ln; 44 if(!inque[v]) 45 { 46 inque[v]=1; 47 que.push(v); 48 } 49 } 50 } 51 } 52 printf("%d\n",dis[n]); 53 } 54 int main() 55 { 56 int n,m,i; 57 int st,nd,ln; 58 while(scanf("%d%d",&n,&m)!=EOF) 59 { 60 if(n==0&&m==0) 61 break; 62 t=1; 63 memset(pre,-1,sizeof(pre)); 64 for(i=1;i<=m;i++) 65 { 66 scanf("%d%d%d",&st,&nd,&ln); 67 if(st!=nd) 68 { 69 addedge(st,nd,ln); 70 addedge(nd,st,ln); 71 } 72 } 73 spfa(n); 74 } 75 return 0; 76 }