NYOJ 115城市平乱(Dijkstra最短路径)

 1 #include<iostream>
 2 #include<queue>
 3 #include<cstdio>
 4 #include<cstring>
 5 #define INF 1<<30
 6 #define Min(x,y) x>y?y:x
 7 using namespace std;
 8 int dist[1003],vis[1003];
 9 int map[1003][1003],city[105];
10 int N,M,P,Q;
11 int Dijkstra()
12 {
13     int i,j,mark,mindis,min_d;
14     memset(vis,0,sizeof(vis));
15     for(i=1; i<=M; i++)dist[i] = INF;//初始化
16     dist[Q] = 0;    //以目的地作为起点
17     for(i=1; i<=M; i++){
18         mark = -1;
19         mindis = INF;
20         for(j=1; j<=M; j++)
21         if( !vis[j] && dist[j] < mindis){
22             mindis = dist[j];
23             mark = j;
24         }
25         vis[mark] = 1;
26         for(j=1; j<=M; j++)if( !vis[j] && map[mark][j])
27         dist[j] = Min(dist[j],dist[mark] + map[mark][j]);
28     }
29     min_d = dist[city[1]];
30     for(i=1; i<=N; i++)
31        if(dist[city[i]] < min_d)min_d = dist[city[i]];
32     return min_d;
33 }
34 int main()
35 {
36     //freopen("in.txt","r",stdin);
37     int T,i,vi,vj,w;
38     cin>>T;
39     while(T--)
40     {
41         cin>>N>>M>>P>>Q;
42         memset(map,0,sizeof(map));
43         for(i=1; i<=N; i++)cin>>city[i];
44         for(i=1; i<=P; i++){
45             cin>>vi>>vj>>w;
46             if(map[vi][vj])
47                 map[vi][vj] = map[vi][vj]<w?map[vi][vj]:w;
48             else
49                 map[vi][vj] = map[vj][vi] = w;
50         }
51         cout<<Dijkstra()<<endl;
52     }
53     return 0;
54 }
55         
View Code
原文地址:https://www.cnblogs.com/qiu520/p/3232589.html