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 }