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 }