20c Dijkstra?

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 }
posted @ 2012-11-18 18:49  xxx0624  阅读(208)  评论(0编辑  收藏  举报