兔子与樱花

描述

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

输入

输入分为三个部分。
第一个部分有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;
}

猜你喜欢

转载自www.cnblogs.com/levarz/p/12933340.html