View Code
1 /* 2 无向 最短路 3 spfa 4 */ 5 #include<stdio.h> 6 #include<string.h> 7 #include<iostream> 8 #include<algorithm> 9 #include<queue> 10 #include<stack> 11 #define maxn 100005 12 const long long inf = 12345678987654321LL; 13 typedef long long ll; 14 using namespace std; 15 int head[ maxn*2 ],vis[ maxn*2 ],path[ maxn*2 ]; 16 ll dis[ maxn*2 ]; 17 struct node{ 18 int v,next; 19 ll val; 20 }edge[ maxn*2 ]; 21 int pindex; 22 void init(){ 23 pindex=0; 24 memset(head,-1,sizeof(head)); 25 memset(path,-1,sizeof(path)); 26 } 27 void addedge(int u,int v,ll val){ 28 edge[pindex].v=v; 29 edge[pindex].val=val; 30 edge[pindex].next=head[u]; 31 head[u]=pindex++; 32 33 edge[pindex].v=u; 34 edge[pindex].val=val; 35 edge[pindex].next=head[v]; 36 head[v]=pindex++; 37 } 38 void output(int n){ 39 int id=n; 40 stack<int>s; 41 s.push(n); 42 //for(int i=0;i<n*n*n;i++)cout<<path[i]<<endl; 43 while(path[id]!=-1){ 44 s.push(path[id]);//printf("%d ",path[id]); 45 id=path[id]; 46 } 47 printf("%d",s.top());s.pop(); 48 while(!s.empty()){ 49 printf(" %d",s.top()); 50 s.pop(); 51 } 52 printf("\n"); 53 } 54 55 void spfa( int n ){ 56 for( int i=1;i<=n;i++ ) dis[ i ]=inf; 57 dis[1]=0; 58 memset( vis,0,sizeof(vis) ); 59 vis[1]=1; 60 queue<int>q; 61 q.push(1); 62 while(!q.empty()){ 63 int id; 64 id = q.front(); 65 q.pop(); 66 vis[ id ]=0; 67 for(int i=head[ id ];i!=-1;i=edge[i].next ){ 68 int v; 69 v=edge[i].v; 70 if(dis[v]>dis[id]+edge[i].val){ 71 dis[v]=dis[id]+edge[i].val; 72 path[v]=id; 73 if(vis[v]==0){ 74 vis[v]=1; 75 q.push(v); 76 //path[v]=i; 77 } 78 } 79 } 80 } 81 if(dis[n]>=inf) 82 printf("-1\n"); 83 else{ 84 output(n); 85 } 86 return ; 87 } 88 89 int main(){ 90 int n,m; 91 cin>>n>>m; 92 init(); 93 while( m-- ){ 94 int a,b; 95 ll c; 96 cin>>a>>b>>c; 97 addedge(a,b,c); 98 } 99 spfa( n ); 100 return 0; 101 }