zoukankan      html  css  js  c++  java
  • 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 } 
  • 相关阅读:
    第二周作业
    求最大值及下标编程总结
    查找整数编程总结
    课程设计第一次实验总结
    第十二周作业
    第十一周作业
    第十周作业
    第九周作业
    第八周作业
    第七周作业
  • 原文地址:https://www.cnblogs.com/Vincent-Bryan/p/6257377.html
Copyright © 2011-2022 走看看