您的位置:首页 > 其它

HDU 2112 HDU Today(dijkstra算法)

2016-05-12 20:29 411 查看
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

没考虑起点终点一样。。。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f
#define MAXN 1000
int n;
int Edge[MAXN][MAXN];///邻接矩阵
int S[MAXN];
int dist[MAXN];
char a[31],b[31];
char d[MAXN][31];
void dijkstra(int v0)
{
int i,j,k;
for(i=1; i<=n; i++)
{
dist[i]=Edge[v0][i];
S[i]=0;
}
dist[v0]=0;
S[v0]=1;///顶点vo加入集合S
for(i=0; i<n-1; i++)///从顶点V0确定n-1条最短路径
{
int min=INF,u=v0;
///选择当前具有最短路径的顶点u
for(j=1; j<=n; j++)
{
if(!S[j]&&dist[j]<min)
{
u=j;
min=dist[j];
}
}
if(min==INF)
continue;
S[u]=1;///将顶点u加入到集合S,表示它的最短路经以求得。
///修改dist数组的元素值
for(k=1; k<=n; k++)
{
if(!S[k]&&Edge[u][k]<INF&&dist[u]+Edge[u][k]<dist[k])
{
dist[k]=dist[u]+Edge[u][k];
}
}
}
}
int main()
{
int m,i,j,c,a1,b1,k;

while(~scanf("%d",&k)&&k!=-1)
{
getchar();
int flag=0;
memset(Edge,0,sizeof(Edge));
scanf("%s%s",d[1],d[2]);
if(strcmp(d[1],d[2])==0)
{
flag=1;
}
n=2;
while(k--)
{
scanf("%s%s%d",&a,&b,&c);
int flag1=1,flag2=1;
for(int i=1; i<=n; i++)
{
if(strcmp(a,d[i])==0)
{
flag1=0;
a1=i;
break;
}
}
if(flag1)
{
strcpy(d[n=n+1],a);
a1=n;
}
for(int i=1; i<=n; i++)
{
if(strcmp(b,d[i])==0)
{
flag2=0;
b1=i;
break;
}
}
if(flag2)
{
strcpy(d[n=n+1],b);
b1=n;
}
Edge[a1][b1]=Edge[b1][a1]=c;
}
if(flag)
{
printf("0\n");
continue;
}
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
if(Edge[i][j]==0)
Edge[i][j]= INF;
dijkstra(1);
if(dist[2]>=INF)
printf("-1\n");
else
printf("%d\n",dist[2]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: