0
点赞
收藏
分享

微信扫一扫

HDU 2112 HDU Today 最短路问题map+floyd


HDU Today


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


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


/*
HDOJ 2112 最短路问题 加了一个字符串处理
想到用map+floyd 实现
*/

#include<iostream>
#include<stdio.h>
#include<map>
#include<string>
using namespace std;
#define MAX 9999999

int mm[155][155];
map<string,int> v;

void Floyd(int maxn)
{
int i,j,k;
for(k=1;k<=maxn;k++)
for(i=1;i<=maxn;i++)
{
if(mm[i][k]!=MAX)
for(j=1;j<=maxn;j++)
{
if(mm[i][j]>mm[i][k]+mm[k][j])
mm[i][j]=mm[i][k]+mm[k][j];
}
}
}

int main()
{
int i,j,n,k,c,flag;
char start[55],end[55],s1[55],s2[55];

//freopen("test.txt","r",stdin);
while(scanf("%d",&n))
{
if(n==-1) break;
v.clear();
flag=0;

k=3;
scanf("%s",start);
scanf("%s",end);
v[start]=1;//起始点,终点为1,2
v[end]=2;

if(strcmp(start,end)==0)
flag=1;//始终点一样要特殊处理

for(i=1;i<155;i++)
for(j=1;j<155;j++)
mm[i][j]=MAX;

for(i=1;i<=n;i++)
{
scanf("%s",s1);
scanf("%s",s2);
if(!v[s1])
v[s1]=k++;
if(!v[s2])
v[s2]=k++;
scanf("%d",&c);
if(mm[v[s1]][v[s2]]>c)
mm[v[s1]][v[s2]]=mm[v[s2]][v[s1]]=c;
}

if(flag)
{
printf("0\n");
continue;
}

Floyd(k-1);//k-1就是城市的总数
printf("%d\n",mm[1][2]==MAX?-1:mm[1][2]);

}
return 0;
}




举报

相关推荐

0 条评论