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;
    }                                 
    
  • 相关阅读:
    molloc堆区的动态内存分配
    异常控制流(csapp)
    优化程序性能(CSAPP)
    链接及链接器
    C# 继承 多态
    virtual和abstract
    封装
    SQL数据库语句优化方法
    select 查询所有和查询所有非空
    联合查询的用法
  • 原文地址:https://www.cnblogs.com/jolin123/p/4122559.html
Copyright © 2011-2022 走看看