openjudge 4083:我爱北大

题目描述

“红楼飞雪,一时英杰……”耳边传来了那熟悉的歌声。而这,只怕是我最后一次听到这个声音了。

想当年,我们曾经怀着豪情壮志,许下心愿,走过静园,走过一体,走过未名湖畔的每个角落。

想当年,我们也曾慷慨高歌,瞻仰民主与科学,瞻仰博雅塔顶,那百年之前的遗韵。

没错,我爱北大,我爱这个校园。

然而,从当我们穿上学位服的那一刻起,这个校园,就再也不属于我。它只属于往事,属于我的回忆。

没错,这,是我在北大的最后一日。此时,此景,此生,此世,将刻骨难忘。

再也没有了图书馆自习的各种纷纭,再也没有了运动场上的挥汗如雨,有的,只是心中永远的不舍,与牵挂。

夜,已深。人,却不愿离去。天边有一颗流星划过,是那般静,宁谧。

忍不住不回头,我的眼边,有泪光,划过。

这时候,突然有一位路人甲从你身旁出现,问你:从XX到XX怎么走?

索性,就让我再爱你一次。因为,北大永远在你心中。北大的地图,永远在你的心中。

轻手挥扬,不带走一分云彩。

Input

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

Output

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

Sample Input

6
XueYiShiTang
CanYinZhongXin
XueWuShiTang
XueYiXiaoBaiFang
BaiNianJiangTang
GongHangQuKuanJi
6
XueYiShiTang CanYinZhongXin 80
XueWuShiTang CanYinZhongXin 40
XueYiShiTang XueYiXiaoBaiFang 35
XueYiXiaoBaiFang XueWuShiTang 85
CanYinZhongXin GongHangQuKuanJi 60
GongHangQuKuanJi BaiNianJiangTang 35
2
XueYiXiaoBaiFang BaiNianJiangTang
GongHangQuKuanJi GongHangQuKuanJi

Sample Output

XueYiXiaoBaiFang->(35)->XueYiShiTang->(80)->CanYinZhongXin->(60)->GongHangQuKuanJi->(35)->BaiNianJiangTang
GongHangQuKuanJi

注意事项

1.  有重边


#include<iostream>

#include<string>
#include<stack>
using namespace std;

#define MAXV 33 
#define INF 1<<29
int v, e;
int g[MAXV][MAXV];
int pre[MAXV][MAXV];
std::string name[MAXV];
stack<int>path;

void floyd(){
    int i, j, k;
    for (k = 1; k <= v; k++){
        for (i = 1; i <= v; i++){
            for (j = 1; j <= v; j++){
                if (g[i][j] > g[i][k] + g[k][j]){
                    g[i][j] = g[i][k] + g[k][j];
                    pre[i][j] = pre[k][j];
                }
            }
        }
    }
}
int getIndex(string str){
    int i;
    for (i = 1; i <= v; i++){
        if (str == name[i]){
            return i;
        }
    }
    return -1;

}
int main(){
    //freopen("in.txt", "r", stdin);
    int i, j;
    cin >> v;
    for (i = 1; i <= v; i++){
        for (j = 1; j <= v; j++){
            g[i][j] = (i == j ? 0 : INF);
            pre[i][j] = -1;
        }
    }
    string str;

    /*读入并存入名字*/
    for (i = 1; i <= v; i++){
        cin >> str;
        name[i] = str; //向map中插入数据
    }
    cin >> e;
    string f, t;
    int fi, ti;
    int w;
    for (i = 1; i <= e; i++){
        cin >> f >> t >> w; //from to weight

        fi = getIndex(f);
        ti = getIndex(t);
        if (w < g[ti][fi] && w < g[fi][ti]){
            g[ti][fi] = g[fi][ti] = w;//双向
            pre[fi][ti] = fi;//初始化前驱
            pre[ti][fi] = ti;
        }// else有重边
    }
    floyd();

    int c;//测试用例
    cin >> c;
    while (c--){
        cin >> f >> t;
        fi = getIndex(f);
        ti = getIndex(t);
        path.push(ti);//压入终点值
        int nti;//新的终点值
        while (pre[fi][ti] != -1){
            ti = pre[fi][ti];
            path.push(ti);
        }
        while (!path.empty()){
            fi = path.top();
            path.pop();
            if (path.size() == 0){
                break;
            }
            ti = path.top();//注意这里不要pop
            cout << name[fi] << "->(";
            cout << g[fi][ti] << ")->";
        }
        cout << name[ti];
        cout << endl;
    }




    //fclose(stdin);
    //freopen("CON", "r", stdin);
    //system("pause");
    return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值