1. 程式人生 > >nyoj-115-城市平亂(dijkstra算法)

nyoj-115-城市平亂(dijkstra算法)

ID HP space clu max using pid ace sizeof

題目鏈接

 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 }

nyoj-115-城市平亂(dijkstra算法)