HDU - 2112 Today

Problem Description
经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了。
这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
 

Input
输入数据有多组,每组的第一行是公交车的总数N(0<=N<=10000);
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。
 

Output
如果徐总能到达目的地,输出最短的时间;否则,输出“-1”。
 

Sample Input
   
   
6 xiasha westlake xiasha station 60 xiasha ShoppingCenterofHangZhou 30 station westlake 20 ShoppingCenterofHangZhou supermarket 10 xiasha supermarket 50 supermarket westlake 10 -1
 

Sample Output
   
   
50


题目涉及的算法并不是很难,数据范围非常亲和,Floyd都能做。但是字符串的处理让人第一次接触还是有些头大的,所以笔者写这篇博客来简单保存一下自己想法。如有不当,恳请指正。
下面主要是利用map<string,int>把字符串和数字对应起来,通过写一个函数,方便地新建关系或者读取元素的值。算法这里用了floyd,其实不是很好的办法,但对于这道题是足够的。

#include<iostream>
#include<cstdio>
#include<map>
#include<string.h>
using namespace std;
#define INF (1e9+7)
int trip[155][155];

//-------字符串转换-------
    string S,E;//保存起始点的站点名
    int X,Y;
    int namecnt;//统计站点名数量,每组数据开始赋初值0;
    map<string,int>name;
int sn(string s)
{
    if(name.count(s))return name[s];
        //如果name已经储存了map元素,返回[s]的编号
    return name[s]=++namecnt;
        //如果没有,新建一个对应关系,标记+1
}
//-----------------------
int main()
{
    string s1,s2;

    int x,y,m,z;
    while(cin>>m&&~m)//输入m且m不等于-1
    {
        //-------初始化过程--------
        namecnt=0;
        name.clear();
        memset(trip,155,sizeof(trip));
        for(int i=1;i<=155;i++)trip[i][i]=0;

        //-------------------------
        cin>>S>>E,X=sn(S),Y=sn(E);
        for(int i=1;i<=m;i++)
        {
            cin>>s1>>s2>>z;
            x=sn(s1);y=sn(s2);//把字符串都转换成数字标记
            trip[x][y]=trip[y][x]=z;
        }

        for(int k=1;k<=namecnt;k++)
        for(int i=1;i<=namecnt;i++)
        for(int j=1;j<=namecnt;j++)
            if(trip[i][j]-trip[k][j]>trip[i][k])
            trip[i][j]=trip[i][k]+trip[k][j];

        if(trip[X][Y]>=INF)printf("-1\n");
        else printf("%d\n",trip[X][Y]);

    }
    return 0;
}






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值