题目链接
1 /*
2 Name:nyoj-115-城市平乱
3 Copyright:
4 Author:
5 Date: 2018/4/25 17:28:06
6 Description:
7 dijkstra模板题
8 枚举从部队所在的城市到叛乱城市取最小值
9 */
10 #include <iostream>
11 #include <cstdio>
12 #include <cstring>
13 #include <cmath>
14 using namespace std;
15 const int MAXN = 1005, INF= 0x3f3f3f3f;
16 int dis[MAXN], g[MAXN][MAXN], N, M, P, Q, army[MAXN], src;
17 bool v[MAXN];
18
19 void dijkstra() {
20 int N = M;
21 for (int i=1; i<=N; i++) dis[i] = INF;
22 dis[src] = 0;
23 memset(v, 0, sizeof(v));
24 for (int i=1; i<=N; ++i) {
25 int mark =-1, mindis=INF;
26 for (int j=1; j<=N; j++) {
27 if(!v[j] && dis[j]<mindis) {
28 mindis = dis[j];
29 mark = j;
30 }
31 }
32 v[mark] = 1;
33 for (int j=1; j<=N; j++) {
34 if (!v[j]) {
35 dis[j] = min(dis[j], dis[mark] + g[mark][j]);
36 }
37 }
38 }
39 }
40 int main()
41 {
42 int t;
43 cin>>t;
44 while (t--) {
45 memset(g, 0x3f, sizeof(g));
46 memset(army, 0, sizeof(army));
47 cin>>N>>M>>P>>Q;
48 for (int i=0; i<N; i++) {
49 cin>>army[i];
50 }
51 for (int i=0; i<P; i++) {
52 int x, y, cost;
53 cin>>x>>y>>cost;
54 if (g[x][y] < cost) continue;
55 g[x][y] = cost;
56 g[y][x] = cost;
57 }
58 int mindis = 0x3f3f3f3f;
59 for (int i=0; i<N; i++) {
60 memset(dis, 0, sizeof(dis));
61 src = army[i];
62 dijkstra();
63 mindis = min(mindis, dis[Q]);
64 }
65 cout<<mindis<<endl;
66 }
67 return 0;
68 }