1 #include<iostream>
2 #include<cstdio>
3 #include<iomanip>
4 #include<queue>
5 #include<map>
6 #include<set>
7 #include<stack>
8 #include<list>
9 #include<algorithm>
10 #include<cmath>
11 #include<cstring>
12 #include<string>
13 #include<sstream>
14 #include<fstream>
15 #define go(t) int t; cin>>t; while(t--)
16 #define ll long long
17 #define rep(i, a, n) for(int i = a; i < n; i++)
18 #define res(i, a, n) for(int i = a - 1; i >= n; i--)
19 using namespace std;
20 const int inf = 0x3f3f3f3f;
21 const int mod = 1e9 + 7;
22 const double pi = acos(-1);
23 const int N = 2520;
24
25 //n为节点数, m为路径数
26 int n, m, a[N][N], dist[N], vis[N];
27
28 //一开始假设所有点之间都不可达, 将点与其他点的距离设置为inf, inf为非常大的正数, 表示正无穷
29 void init(){
30 rep(i, 1, n + 1){ //rep在我的宏定义里面
31 rep(j, 1, n + 1)
32 a[i][j] = inf;
33 a[i][i] = 0; //自己到自己的距离到然是0了, Dijkstra可以没有, 但是Floyd必须加
34 }
35 }
36
37 int Dijkstra(int st){
38 rep(i, 1, n + 1){
39 vis[i] = 0; //vis来表示是否访问过该节点
40 dist[i] = a[st][i]; //dist表示起点到其他点的距离
41 }
42 //一开始先把起点置为1, 表示已经访问过了, 到自己的距离当然是0
43 vis[st] = 1; dist[st] = 0;
44
45 rep(i, 1, n + 1){
46 int k, mm = inf;
47 //这里先来找寻其他点到起点距离最近的点, mm表示当前的最短距离, k为相应的点
48 rep(j, 1, n + 1){
49 if(!vis[j] && mm > dist[j]){
50 mm = dist[j];
51 k = j;
52 }
53 }
54 //如果mm没有更新过, 说明都访问过了, 退出
55 if(mm == inf) break;
56 //将k设置已访问
57 vis[k] = 1;
58 //利用k来更新起点到其他点的距离
59 rep(j, 1, n + 1)
60 if(!vis[j] && dist[j] > dist[k] + a[k][j])
61 dist[j] = dist[k] + a[k][j];
62 }
63 }
64
65 //这个函数是为了方便我Debug
66 void show(){
67 rep(i, 1, n + 1){
68 rep(j, 1, n + 1)
69 cout << a[i][j] << " ";
70 cout << endl;
71 }
72 cout << endl;
73 rep(i, 1, n + 1){
74 cout << vis[i] << " " << dist[i] << endl;
75 }
76 }
77
78 int main(){
79 //x表示起点, y表示终点
80 int x, y;
81 while(cin >> n >> m >> x >> y){
82 init(); //还是提醒一句, init函数写了记得用上
83 int ss, ee, vv;
84 rep(i, 1, m + 1){
85 scanf("%d%d%d", &ss, &ee, &vv);
86 //由于ss与ee之间可能有多条路可达, 所以我们选择最短的一条
87 //但是这个题比较不阴险, 没有设置这个坑, 不加也是可以A的
88 if(vv < a[ss][ee])
89 a[ss][ee] = a[ee][ss] = vv;
90 }
91 Dijkstra(x);
92 //经过Dijkstra算法之后, 起点到其他各个点的最短路径dist[y]均已求出来, 若dist[y]为inf, 则表示这两点不可达
93 cout << dist[y] << endl;
94 }
95 return 0;
96 }