zoukankan      html  css  js  c++  java
  • 兔子与樱花

    描述

    很久很久之前,森林里住着一群兔子。有一天,兔子们希望去赏樱花,但当他们到了上野公园门口却忘记了带地图。现在兔子们想求助于你来帮他们找到公园里的最短路。

    输入

    输入分为三个部分。
    第一个部分有P+1行(P<30),第一行为一个整数P,之后的P行表示上野公园的地点。
    第二个部分有Q+1行(Q<50),第一行为一个整数Q,之后的Q行每行分别为两个字符串与一个整数,表示这两点有直线的道路,并显示二者之间的矩离(单位为米)。
    第三个部分有R+1行(R<20),第一行为一个整数R,之后的R行每行为两个字符串,表示需要求的路线。

    输出

    输出有R行,分别表示每个路线最短的走法。其中两个点之间,用->(矩离)->相隔。

    样例输入

    6
    Ginza
    Sensouji
    Shinjukugyoen
    Uenokouen
    Yoyogikouen
    Meijishinguu
    6
    Ginza Sensouji 80
    Shinjukugyoen Sensouji 40
    Ginza Uenokouen 35
    Uenokouen Shinjukugyoen 85
    Sensouji Meijishinguu 60
    Meijishinguu Yoyogikouen 35
    2
    Uenokouen Yoyogikouen
    Meijishinguu Meijishinguu
    

    样例输出

    Uenokouen->(35)->Ginza->(80)->Sensouji->(60)->Meijishinguu->(35)->Yoyogikouen
    Meijishinguu
    

    实际就是求图任意两个顶点的最短路径:

    1. 可以通过以每个顶点作为源点循环求出没每队顶点之间的最短路径,即带入Dijkstra算法;
    2. 直接通过Floyd算法求解
      具体参考:兔子与樱花---每对结点的最短路径

    完整代码

    #include <iostream>
    #include <stdlib.h>
    #include <string>
    #include <map>
    #define INF 32767
    #define MAX_SIZE 100
    #define MAX_LEN 50
    
    using namespace std;
    
    map<string,int> position_to_num;
    map<int,string> num_to_position;
    
    typedef struct
    {
        int len;
        int pre;
    }Postion;
    
    Postion roads[MAX_SIZE][MAX_SIZE];
    void DisRoads(int f, int s)
    {
        if (f == s) {
            cout << num_to_position[f];
            return;
        } 
        DisRoads(f,roads[f][s].pre);
        cout <<"->" <<"(" << roads[roads[f][s].pre][s].len <<")" <<"->" <<num_to_position[s];
    }
    int main(int argc, char const *argv[])
    {
        string position_name;
        int P, Q, R, i, j, k;
        /*******************第一部分*******************/
        cin >> P;
        for (i = 0; i < P; i++) {
           cin >> position_name;
           position_to_num.insert(pair<string,int>(position_name,i));
           num_to_position.insert(pair<int,string>(i,position_name));
        }
        /******************初始化路径******************/
        for (i = 0; i < P; i++) {
            for (j = 0; j < P; j++) {
                if (i != j) {
                    roads[i][j].len = INF;
                    roads[i][j].pre = -1;
                } else {
                    roads[i][j].len = 0;
                    roads[i][j].pre = i;
                }
            }  
        }
        /*******************第二部分*******************/
        cin >> Q;
        string position_name_first, position_name_second;
        int len;
        for (i = 0; i < Q; i++) {
            cin >> position_name_first >> position_name_second >> len;
            if (roads[position_to_num[position_name_first]][position_to_num[position_name_second]].len>len) {
                //如果当前路径是最小路径
                roads[position_to_num[position_name_first]][position_to_num[position_name_second]].len = len;
                roads[position_to_num[position_name_first]][position_to_num[position_name_second]].pre = position_to_num[position_name_first];
                roads[position_to_num[position_name_second]][position_to_num[position_name_first]].len = len;
                roads[position_to_num[position_name_second]][position_to_num[position_name_first]].pre = position_to_num[position_name_second];
            }
        }
        /*******************Floyd算法******************/
        for (k = 0; k < P; k++) {
            for (i = 0; i < P; i++) {
                for (j = 0; j < P; j++) {
                    if (roads[i][j].len > roads[i][k].len + roads[k][j].len) {
                        roads[i][j].len = roads[i][k].len + roads[k][j].len;
                        roads[i][j].pre = roads[k][j].pre;
                    }
                } 
            }
        }
        /*******************第三部分*******************/
        cin >> R;
        while (R--) {
            cin >> position_name_first >> position_name_second;
            DisRoads(position_to_num[position_name_first],position_to_num[position_name_second]);
            cout << endl;
        }
        system("pause");
        return 0;
    }
    
  • 相关阅读:
    mysql 数据库检查与修复的办法
    SECPATH透明模式下VLAN透传配置实例
    腾讯QQ所有的服务器
    AutoRuns 9.13 汉化版
    IP地址在数据库中的存储解决方案
    DNS智能解析 for windows 2003
    Windows Media Player ActiveX 控件参数
    删除nvidia右键菜单
    通过js控制cookies
    正确使用|(按位或)和||(逻辑或)
  • 原文地址:https://www.cnblogs.com/levarz/p/12933340.html
Copyright © 2011-2022 走看看