HDOJ 2112 HDU Today (STL_map + dijkstra)

来源:互联网 发布:2站域名www.tt69.com 编辑:程序博客网 时间:2024/06/17 19:36

HDU Today

                                                               Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
                                                                                               Total Submission(s): 31623    Accepted Submission(s): 7698


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
6xiasha westlakexiasha station 60xiasha ShoppingCenterofHangZhou 30station westlake 20ShoppingCenterofHangZhou supermarket 10xiasha supermarket 50supermarket westlake 10-1
 

Sample Output
50Hint:The best route is:xiasha->ShoppingCenterofHangZhou->supermarket->westlake虽然偶尔会迷路,但是因为有了你的帮助**和**从此还是过上了幸福的生活。――全剧终――
 

Author
lgx
 

Source
ACM程序设计_期末考试(时间已定!!)
 

Recommend
lcy   |   We have carefully selected several similar problems for you:  1217 2680 1385 1690 2722 

 
分析: 之前的都是用二维数组存图,地点都由下标表示。所以这题首要的就是把地名用整数下标表示,再用二维数组存图。
             map的基本用法, 参考: http://www.cnblogs.com/hailexuexi/archive/2012/04/10/2440209.html

AC代码:

#include <bits/stdc++.h>#define PI acos(-1)#define INF 0x3f3f3f3f#define SCD(a) scanf("%d",&a)#define SCDD(a,b) scanf("%d%d",&a,&b)#define SCF(a) scanf("%lf",&a)#define PTD(a) printf("%d", a)#define PTDE(a) printf("%d\n",a)#define MST(a,b) memset(a, b, sizeof(a))typedef long long LL;using namespace std;//                  hdoj 2112const int M = 160;int ans = 0;int T, n, m, t;int maz[M][M], dis[M];bool vis[M];map<string, int> mp;void init(){    int i, j;    t = 1;    mp.clear();    MST(vis, false);    fill(dis, dis+n+2, INF);    for(i=0; i<M; i++){        for(j=0; j<M; j++)            maz[i][j] = INF;    }}void dijkstra(int st, int en){    int i, j, pos, d;    for(i=1; i<=t; i++)        dis[i] = maz[st][i];    dis[st] = 0;    vis[st] = true;    for(i=1; i<=n; i++){        d = INF;        for(j=1; j<=t; j++){            if(!vis[j] && dis[j] < d){                d = dis[j];                pos = j;            }        }        vis[pos] = true;        if(d == INF)            continue;        for(j=1; j<=t; j++){            if(!vis[j] && dis[j] > dis[pos] + maz[pos][j]){                dis[j] = dis[pos] + maz[pos][j];            }        }    }    ans = dis[en];}int main(){    int i, j, k, d;    string sa, sb;    while(~SCD(n) && n!=-1){        init();        string st, en;        cin>>st>>en;        mp[st] = t;        t++;        mp[en] = t;        t++;        for(i=0; i<n; i++){            cin>>sa>>sb;            SCD(d);            if(!mp[sa]){                mp[sa] = t;                t++;            }            if(!mp[sb]){                mp[sb] = t;                t++;            }            maz[ mp[sa] ][ mp[sb] ] = maz[ mp[sb] ][ mp[sa] ] = min(maz[ mp[sa] ][ mp[sb] ], d);        }        dijkstra( mp[st], mp[en] );        if(ans != INF)            PTDE(ans);        else            PTDE(-1);    }    return 0;}/**/





原创粉丝点击