题目描述:

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 Hint: The best route is: xiasha->ShoppingCenterofHangZhou->supermarket->westlake
 
 
 
 
解题报告:
感觉这题好坑,一开始没看到时间限制是5000ms,所以一直想用迪杰斯特拉过,但是这题有一个到底能否到达的问题,所以用弗洛伊德比较好,要注意的问题是要注意判断起点和终点相同的情况,直接输出0就可以 了,还有就是这题我一开始用暴力判断输入的地名前面有没有出现过,时间较短,但是后面用STL里面的map容器来判断时间反而变长了,一直不解,希望哪位知道的看到了可以告诉我。两种代码都附上吧。
用了STL的代码:
 #include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<string>
using namespace std;
const int MAX = 0xffffff,SIZE = ;
int Map[SIZE][SIZE];
char str1[][],str2[][];
int str3[];
int n,f;
map<string,int> map1;
int judge(char *p) {
string s1 = p;
pair<map<string,int>::iterator,bool> iter;
iter = map1.insert(pair<string,int> (s1,++f));
if(iter.second)
return f;
else {
f--;
return map1[s1];
}
}
int main() {
char sta[],end[];
int s,e;
while(scanf("%d",&n)&&n!=-) {
map1.clear();
scanf("%s%s",sta,end);
f = ;
for(int i = ;i<=n;++i)
scanf("%s%s%d",str1[i],str2[i],&str3[i]);
if(!strcmp(sta,end)) {
printf("0\n");
continue;
}
for(int i = ;i<SIZE;++i) {
Map[i][i] = ;
for(int j = ;j<SIZE;++j)
Map[i][j] = MAX;
} for(int i = ;i<=n;++i) {
int x = judge(str1[i]);
int y = judge(str2[i]);
Map[x][y] = Map[y][x] = str3[i];
}
s = judge(sta);
e = judge(end);
for(int i = ;i<=f;++i)
for(int j = ;j<=f;++j)
for(int k = ;k<=f;++k)
Map[j][k] = std::min(Map[j][i]+Map[i][k],Map[j][k]);
if(Map[s][e]==MAX)
printf("-1\n");
else printf("%d\n",Map[s][e]);
}
return ;
}

没用STL的代码:

 #include<cstdio>
#include<cstring>
#include<iostream>
const int MAX = 0xffffff,SIZE = ;
int map[SIZE][SIZE];
char str1[][],str2[][],str[][];
int str3[];
int n,f;
int judge(char *p) {
for(int i = ;i<=f;++i)
if(!strcmp(str[i],p))
return i;
strcpy(str[++f],p);
return f;
}
int main() {
char s1[],s2[],sta[],end[];
int s,e;
while(scanf("%d",&n)&&n!=-) {
scanf("%s%s",sta,end);
f = ;
for(int i = ;i<=n;++i)
scanf("%s%s%d",str1[i],str2[i],&str3[i]);
if(!strcmp(sta,end)) {
printf("0\n");
continue;
}
for(int i = ;i<SIZE;++i) {
map[i][i] = ;
for(int j = ;j<SIZE;++j)
map[i][j] = MAX;
}
for(int i = ;i<=n;++i) {
int x = judge(str1[i]);
int y = judge(str2[i]);
map[x][y] = map[y][x] = str3[i];
}
s = judge(sta);
e = judge(end);
for(int i = ;i<=f;++i)
for(int j = ;j<=f;++j)
for(int k = ;k<=f;++k)
map[j][k] = std::min(map[j][i]+map[i][k],map[j][k]);
if(map[s][e]==MAX)
printf("-1\n");
else printf("%d\n",map[s][e]);
}
return ;
}

HDU 2112 HDU Today 最短路的更多相关文章

  1. hdu 2112 HDU Today

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的 ...

  2. HDU 2112 HDU Today(Dijkstra)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Time Limit: 15000/5000 MS (Java/Others ...

  3. hdu 2112 HDU Today (最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意:给出起点和终点,然后算出最短的路. 不过有好多细节要注意: (1)起始点和终止点相等的 ...

  4. hdu 2112(字典树+最短路)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. hdu 2112 HDU Today (最短路,字符处理)

    题目 题目很简单,只是多了对地名转化为数字的处理,好吧,这我也是参考网上的处理办法,不过大多数的人采用map来处理 注意初始化注意范围,不然会wa!!!(这是我当时wa的原因org) 大家容易忽视的地 ...

  6. hdu 2112 HDU Today 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目意思:又是求最短路的,不过结合埋字符串来考查. 受之前1004 Let the Balloo ...

  7. HDU 2112 HDU Today (Dijkstra算法)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. hdu 2112 HDU Today (floyd算法)

    这道题貌似在原来学长给我们的搞的小比赛中出过! 这次又让我遇到,果断拿下! 不过方法很蠢,跑了1000多ms,虽然要求5000ms以内! 题目就是给你一些位置之间的距离,然后再让你求特定的两点之间的距 ...

  9. HDU 2112 HDU Today(STL MAP + Djistra)

    题目链接:HDU Today 立即集训要開始,抓紧时间练练手,最短路的基础题,第一次用STL的map 题目非常水,可是错了N遍.手贱了.本题不优点理的就是把地名转化为数字 #include <i ...

随机推荐

  1. 关于InfiniBand几个基本知识点解释

    文章出处: https://blog.csdn.net/BtB5e6Nsu1g511Eg5XEg/article/details/83629279 公众号 https://blog.csdn.net/ ...

  2. 智能合约bug以及修改方案

    截取两篇文章:第一遍文章说的是智能合约能不能修改的问题: ETC转到ETH地址以及转币进ETH智能合约账户能不能转出来? 第0章 引言 如果ETC充值到了ETH地址上,能找回来吗?答案是不一定. ET ...

  3. 软件工程团队项目第一次Sprint评审

    第一组:9-652 作品:炸弹人 评价:已经完成了界面的设计和基本功能,游戏已初具雏形.这款游戏可玩性很强,是个很不错的项目.但是对游戏并没有进行深入开发,不能持续的吸引玩家的兴趣,容易引起玩家的厌倦 ...

  4. WAMP的一些配置修改

    一.修改php运行的目录,即www目录 1. 在工具栏里点击 Apache->httpd.conf 2. 找到 DocumentRoot "G:/PHP/wamp/www/" ...

  5. Beta冲刺——day3

    Beta冲刺--day3 作业链接 Beta冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602134 王龙 ...

  6. 什么是Asp.net Core?和 .net core有什么区别?

    为什么要写这篇文章 写这篇文章有两个原因,第一个是因为新站点创建出来后一直空置着,所以写一篇文章放在这里.第二就是因为近来在做一些基于Asp.net core平台的项目开发,也遇到了一些问题,正好趁此 ...

  7. [转帖] Windows 与linux的栈大小问题

    一般来说,我们所用的内存有栈和堆之分,其它的我们很少控制,栈的速度快,但是空间小.不灵活:而堆的空间几乎可以满足任何要求.灵活,但是相对的速度要慢了很多,并且在VC中堆是人为控制的,new了就要del ...

  8. 重启Hbase命令

    注意先启动hadoop,记得重启zookeeper. 具体操作如下: cd hadoop-2.7.4/sbin/ && ./stop-all.sh && ./start ...

  9. Codeforces 1097 G. Vladislav and a Great Legend

    题目链接 一道好题. 题意:给定一棵\(n\)个点的树,求: \[\sum_{S\subseteq \{1,2,\dots,n\}}f(S)^k\] 其中\(f(S)\)代表用树边将点集\(S\)连通 ...

  10. angular安装记录

    1. 安装node.js,下载地址:https://nodejs.org/en/download/,详细的安装教程参考这里:https://blog.csdn.net/u010255310/artic ...