HDU Today

来源:互联网 发布:sql中delete是删除什么 编辑:程序博客网 时间:2024/05/16 19:24
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虽然偶尔会迷路,但是因为有了你的帮助**和**从此还是过上了幸福的生活。――全剧终――


题解:最短路径,迪杰斯特拉算法,先用map将一个地方给一个不同的编号,在对编号用该算法得到结果。


#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <map>using namespace std;const int INF = 0x3fffffff;int m[2000][2000];  //保存两点之间的时间 map<string,int> mp; //编号 bool visited[20000];int res[20000];     //起点到每一点的最短路径 int cnt,st,en;int solve(string& s)  //编号 {if(mp.count(s) != 0)  //该地点存在,返回编号 {return mp[s];}return mp[s] = ++cnt;  //不存在,给他编号并返回 }void getRes(){memset(visited,false,sizeof(visited));for(int i = 1;i <= cnt;i++)    //从st开始 {res[i] = m[st][i];}visited[st] = true;for(int i = 1;i < cnt;i++){int min = INF;int k;for(int j = 1;j <= cnt;j++){if(!visited[j] && min > res[j]){min = res[j];k = j;}}if(min == INF)   //表示所有最短边都找到了 {break;}visited[k] = true;for(int j = 1;j <= cnt;j++)   //更新最短边 {if(!visited[j] && res[j] > res[k] + m[k][j]){res[j] = res[k] + m[k][j];}}}}int main(){int n;string s1,s2;int time;while(scanf("%d",&n) && n != -1){cin>>s1>>s2;cnt = 0;st = solve(s1);en = solve(s2);for(int i = 0;i <= 200;i++)  //初始化,INF表示不能到达 {for(int j = 0;j <= 200;j++){if(i == j){m[i][j] = 0;}else{m[i][j] = INF;}}}for(int i = 0;i < n;i++){cin>>s1>>s2>>time;int x = solve(s1);int y = solve(s2);m[x][y] = m[y][x] = time;}getRes();if(res[en] != INF)  //能到达 {cout<<res[en]<<endl;}else{cout<<"-1\n";}mp.clear();      //很重要 }return 0; } 


0 0