Dijkstra代码解释版

 1 //Dijkstra代码解释版本0.99 
 2 #include<iostream>
 3 using namespace std;
 4 
 5 const int maxn=1000+10;
 6 const int INF=0x3fffffff;                    //因为dijkstra会有2个最大值相加的情况,所以用0x7fffffff会溢出
 7 
 8 int map[maxn][maxn];            
 9 int dis[maxn];                                //dis[i]表示当前源点到i的最短距离
10 
11 bool used[maxn];    
12 
13 void init()
14 {
15     for(int i=0;i<maxn;i++)
16     {
17         for(int j=0;j<maxn;j++)
18         {
19             map[i][j]=INF;                    //初始化图没有边,全部距离为无穷大INF
20         }
21         dis[i]=INF;    
22     }
23     memset(used,0,sizeof(used));
24 }
25 
26 int dijkstra(int start,int end,int n)        //起点,终点,总点数编号为[1,n]
27 {
28     
29     int minNode;        
30     dis[start]=0;                            //初始化起点
31     
32     for(int i=1;i<=n;i++)                    //n-1次循环确定n-1个点的dis[i]为最短路
33     {
34         int min=INF;
35         for(int j=1;j<=n;j++)                //找出未标记过的离源点最近的点
36         {
37             if(!used[j] && dis[j]<min)
38             {
39                 min=dis[j];
40                 minNode=j;                    //minNode为当前到起点距离最短的点
41             }    
42         }
43         
44         used[minNode]=1;                    //标记是灰常重要的~~
45         
46         for(int k=1;k<=n;k++)                //松弛操作:以minNode为中间点,如果start->minNode->k的距离小于start->k,则start->k赋值为start->minNode->k
47         {
48             if(!used[k] && dis[minNode]+map[minNode][k]<dis[k])
49             {
50                 dis[k]=dis[minNode]+map[minNode][k];
51             }
52         }
53     }
54 
55     if(dis[end] != INF)
56         return dis[end] ;
57     else
58         return -1 ;
59     
60 }
61 
62 int main()
63 {
64     int n,m;
65     int a,b,c;
66     while(cin>>n>>m,n+m)
67     {
68         init();
69         while(m--)
70         {
71             cin>>a>>b>>c;
72             if(c<map[a][b])                        //判重边
73             {
74                 //map[a][b]=map[b][a]=c;            //无向边
75                 map[a][b]=c;                    //有向边
76             }
77         }
78         
79         int start,end;
80         cin>>start>>end;
81         cout<<  dijkstra(start,end,n)  <<endl;
82 
83     }
84     return 0;
85 }

 

posted @ 2012-09-04 20:22  pc....  阅读(220)  评论(0)    收藏  举报