zoukankan      html  css  js  c++  java
  • Sicily 1031. Campus 解题报告

    1031_Campus

    题目链接:

    http://soj.me/1031

    题目大意:

    给出四个校区的一些地点之间的距离,地点名用字符串来表示,问某两个地点之间的最短路径长度,典型的单源最短路径题目

    思路:

    单源最短路径问题可以用dijkstra算法实现,这道题比较麻烦的是用字符串来表示地点,我用的处理方法是建立map得到地点名字到序号的映射,对于每个新输入的地点名字,先在map里面查找是否存在,如果不存在就绑定一个新的序号.地点之间的距离用邻接矩阵来存放.

    代码:

    #include <iostream>
    #include <memory.h>
    #include <map>
    #include <queue>
    #include <vector>
    using namespace std;
    
    const int INF = 100000;
    int distances[300][300];
    int shortest[300];
    bool included[301];
    map<string, int> m;
    int numRoads;
    int numPlaces;
    string start_name, end_name;
    
    
    void input_and_init();
    int find_shortest();
    int find_nearest();
    
    int main() {
        int numTestcases;
        cin >> numTestcases;
        while (numTestcases--) {
            input_and_init();
    
            if(start_name == end_name)
                cout << 0 << endl;
            else if(m.count(start_name) == 0 || m.count(end_name) == 0)
                cout << -1 << endl;
            else
                cout << find_shortest() << endl;
        }
        return 0;
    }
    void input_and_init(){
        cin >> numRoads;
        numPlaces = 0;
        m.clear();
        for (int i = 0; i < 300; ++i) {
            for (int j = 0; j < 300; ++j) {
                distances[i][j] = (i == j ? 0 : INF);
            }
        }
        memset(included, false, sizeof(included));
        for (int i = 0; i < 300; ++i) {
            shortest[i] = INF;
        }
    
        string s1, s2;
        int d;
        for (int i = 0; i < numRoads; ++i) {
            cin >> s1 >> s2 >> d;
            if(m.count(s1) == 0)
                m[s1] = ++numPlaces;
            if(m.count(s2) == 0)
                m[s2] = ++numPlaces;
            distances[m[s1]][m[s2]] = distances[m[s2]][m[s1]] = d;
        }
        cin >> start_name >> end_name;
    }
    
    int find_shortest(){
        //Post: 如果起点和终点间有连通则返回最短路径长度,否则返回-1
        int start = m[start_name], end = m[end_name];
        shortest[start] = 0;
        for (int i = 0; i < numPlaces; ++i) {
            int cur = find_nearest();
            included[cur] = true;
            for (int j = 1; j <= numPlaces; ++j) {
                if(!included[j]  && shortest[j] > shortest[cur] + distances[cur][j]){
                    shortest[j] = shortest[cur] + distances[cur][j];
                }
            }
        }
        if(shortest[end] < INF)
            return shortest[end];
        else
            return -1;
    }
    int find_nearest(){
        //返回当前离集合S最近的点的下标
        int nearest_index = 0;
        int shortestDistance = INF;
        for (int i = 1; i <= numPlaces; ++i) {
            if(shortest[i] < shortestDistance && !included[i]){
                nearest_index = i;
                shortestDistance = shortest[i];
            }
        }
        return  nearest_index;
    }                                 
    
  • 相关阅读:
    kafka的一些坑
    文件上传到七牛云oss并刷新cdn
    docker swarm集群常用操作
    kubernets中jenkins使用清华源加速插件安装
    获取jenkins插件最新版本
    kubeadm安装集群系列-7.部署jenkins
    kubeadm安装集群系列-6.ingress-nginx安装
    docker清理
    kubeadm安装集群系列-5.其他操作
    kubeadm安装集群系列-4.证书更新
  • 原文地址:https://www.cnblogs.com/jolin123/p/4122559.html
Copyright © 2011-2022 走看看