这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,m,i,j,x,y,min,c,f,k;
int map[153][153],b[153];
string bl[153],s1,s2;
while(scanf("%d",&n),n!=-1)
{
memset(b,0,sizeof(b));
for(i=0;i<153;i++)
for(j=0;j<153;j++)
map[i][j]=0xffffff;
cin>>s1>>s2;f=1;k=1;
if(s1==s2)
f=0;
bl[0]=s1;
if(f)
bl[k++]=s2;
for(min=0;min<n;min++)
{
cin>>s1>>s2>>c;
x=y=333;
for(i=0;i<k;i++)
{
if(bl[i]==s1) x=i;
if(bl[i]==s2) y=i;
}
if(x==333) {bl[k++]=s1;x=k-1;}
if(y==333) {bl[k++]=s2;y=k-1;}
map[x][y]=map[y][x]=c<map[x][y]?c:map[x][y];
}
if(!f) {printf("0\n");continue;}
b[0]=1;
m=k-1;
while(m--)
{
min=0xffffff;
for(i=1;i<k;i++)
if(!b[i]&&map[0][i]<min)
{
j=i;
min=map[0][i];
}
b[j]=1;
for(i=1;i<k;i++)
if(!b[i]&&map[0][j]+map[j][i]<map[0][i])
map[0][i]=map[0][j]+map[j][i];
}
if(map[0][1]==0xffffff)
printf("-1\n");
else
printf("%d\n",map[0][1]);
}
return 0;
}
//不懂,怎么会相差这么多,上面做法4780Ms,换了一点就成1030Ms了、、、C++的输入输出和C就差这么多?
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,m,i,j,x,y,min,c,f,k;
int map[153][153],b[153];
char bl[153][33],s1[33],s2[33];
while(scanf("%d",&n),n!=-1)
{
memset(b,0,sizeof(b));
for(i=0;i<153;i++)
for(j=0;j<153;j++)
map[i][j]=0xffffff;
scanf("%s%s",s1,s2);f=1;k=1;
if(strcmp(s1,s2)==0)
f=0;
strcpy(bl[0],s1);
if(f)
{strcpy(bl[k],s2);k++;}
for(min=0;min<n;min++)
{
scanf("%s%s%d",s1,s2,&c);
x=y=333;
for(i=0;i<k;i++)
{
if(strcmp(bl[i],s1)==0) x=i;
if(strcmp(bl[i],s2)==0) y=i;
}
if(x==333) {strcpy(bl[k],s1);x=k;k++;}
if(y==333) {strcpy(bl[k],s2);y=k;k++;}
map[x][y]=map[y][x]=c<map[x][y]?c:map[x][y];
}
if(!f) {printf("0\n");continue;}
b[0]=1;
m=k-1;
while(m--)
{
min=0xffffff;
for(i=1;i<k;i++)
if(!b[i]&&map[0][i]<min)
{
j=i;
min=map[0][i];
}
b[j]=1;
for(i=1;i<k;i++)
if(!b[i]&&map[0][j]+map[j][i]<map[0][i])
map[0][i]=map[0][j]+map[j][i];
}
if(map[0][1]==0xffffff)
printf("-1\n");
else
printf("%d\n",map[0][1]);
}
return 0;
}