HDU Today (最短路径+map)

经过锦囊相助,海东集团终于度过了危机,从此,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

1、先开始感觉跟之前做的一样,就是把数字改成了字符串,但是想想就不知道该怎么把这两个一一对应上,看了参考原来是用map容器,今天学到了~map用起来还是很方便的,包含一下头文件map,声明map<,>m,将其初始化为0,然后就跟数组一样对应就好了。
2、然后就是用dijkstra,经过上一题的悲惨经历,虽然还有点没理解,不过能大概敲出来了= =
3、还有就是交的时候还re了两次,应该是因为数组越界了,所以在dijkstra求每一次的最小边时,如果求出的minn已经是inf了,就break已经不用再求了。

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <cmath>
#include <string>
#define inf 0x3f3f3f3f
#include <map>
using namespace std;
int mapp[170][170], i, j, cst[170], vis[170], cnt;
void dij()
{
    int p, minn;
    memset(vis, 0, sizeof(vis));
    for(i=1; i<=cnt; i++)
        cst[i]=mapp[1][i];
    vis[1]=1;
    for(i=1; i<=cnt; i++){
        minn=inf;
        for(j=1; j<=cnt; j++){
            if(cst[j]<minn && !vis[j])
            {
                p=j;
                minn=cst[j];
            }
        }
        if(minn==inf)break;
        vis[p]=1;
        for(j=1; j<=cnt; j++){
            if(cst[p]+mapp[p][j]<cst[j] && !vis[j])
                cst[j]=cst[p]+mapp[p][j];
        }
    }
}
int main()
{
    int N;
    while(~scanf("%d", &N)){
        if(N==-1)break;
        map<string, int>mp;
        mp.clear();
        memset(mapp, inf, sizeof(mapp));
        string s1, s2;
        int flag=0;
        cin>>s1>>s2;
        if(s1==s2)flag=1;
        mp[s1]=1;
        mp[s2]=2;
        cnt=3;
        while(N--){
            string ss1, ss2;
            int c;
            cin>>ss1>>ss2>>c;
            if(!mp[ss1])mp[ss1]=cnt++;
            if(!mp[ss2])mp[ss2]=cnt++;
            mapp[mp[ss1]][mp[ss2]]=mapp[mp[ss2]][mp[ss1]]=c;
        }
        if(flag){printf("0\n"); continue;}
        dij();
        if(cst[2]==inf)printf("-1\n");
        else printf("%d\n", cst[2]);
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值