Sicily 1031: Campus (最短路)

  这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码

 1 #include<bits/stdc++.h>
 2 #define MAX  1000000
 3 using namespace std;
 4 
 5 int dis[1000];//记录每个点到起始点的距离 
 6 int edge[1000][1000];//邻接矩阵 
 7 void init(){
 8     for(int i = 0; i < 1000; i++){
 9         for(int j = 0; j < 1000; j++)edge[i][j] = MAX;//邻接矩阵初始化为MAX 
10     }
11 }
12 int Dijkstra(int size, int start, int end){
13     int vertex[size];
14     memset(vertex, 0, sizeof(vertex));//判断是否在已确定距离的集合里 
15     
16     for(int i = 0; i < size; i++){
17         dis[i] = (i == start ? 0 : MAX);//起始点的距离权重为0,其他为MAX 
18     }
19     
20     for(int i = 0; i < size; i++){
21         int min_dis = MAX ;
22         int min_v;
23         
24         for(int j = 0; j < size; j++){//寻找最小的距离点 
25             if(!vertex[j] && dis[j] < min_dis){
26                 min_dis = dis[j];
27                 min_v = j; 
28             }
29         }
30         
31         vertex[min_v] = 1;//将其加入集合 
32         
33         for(int j = 0; j < size; j++){//更新dis距离集合 
34             dis[j] = min(dis[j], dis[min_v] + edge[min_v][j]);
35         }
36     }
37     
38     if(!vertex[end]) return -1;
39     else return dis[end];
40     
41 } 
42 
43 int main(){
44     int t;
45     cin >> t;
46     while(t--){
47         init();
48         int edge_num;
49         cin >> edge_num;
50         string s1, s2;
51         int c;
52         map<string, int>_map;
53         int v_num = 0;
54         while(edge_num--){
55             cin >> s1 >> s2;
56             if(_map.find(s1) == _map.end())_map[s1] = v_num++;
57             if(_map.find(s2) == _map.end())_map[s2] = v_num++;
58             int a = _map[s1];
59             int b = _map[s2];
60              cin >> edge[a][b];
61             edge[b][a] = edge[a][b];
62         }
63         
64         cin >> s1 >> s2;
65         
66         if(s1 == s2) cout << '0' << endl;//假如两个地点相同,输出0 
67         else if(_map.find(s1) == _map.end() || _map.find(s2) == _map.end()) {
68             cout << "-1" << endl;//假如有一个地点不在给出的路径中,输出-1 
69         }
70         else {
71             int a = _map[s1];
72             int b = _map[s2];
73             cout << Dijkstra(v_num, a, b) << endl;//输出最短路 
74         }
75     }
76 } 

 

posted @ 2017-01-06 18:24  Vincent_Bryan  阅读(253)  评论(0编辑  收藏  举报