您的位置:首页 > 其它

一个人的旅行

2017-10-31 18:07 197 查看


问题 I: 一个人的旅行

时间限制: 1 Sec  内存限制: 128 MB

[提交][状态][讨论版]


题目描述

虽然草儿是个路痴,但是草儿仍然很喜欢旅行。眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车。


输入

输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;

接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)

接着的第T+1行有S个数,表示和草儿家相连的城市;

接着的第T+2行有D个数,表示草儿想去地方。


输出

输出草儿能去某个喜欢的城市的最短时间。


样例输入

6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10


样例输出

9

这道题具有多个起点,而Dijkstra主要特点是以起始点为中心向外层层扩展, 
直到扩展到终点为止,这里可以扩展一下,把草儿家乡作为起点,起点与邻边城市相连, 
距离,开车时间都为零。因为终点也不确定,再设一个终点,使其原本终点(想去的城市) 
到我们设的终点为零,城市从1开始,所以起点可为0,终点为最大城市编号+1
# include<stdio.h>
# include<string.h>
# define MAX 0x3f3f3f
int a[1005][1005],vis[1005],c[1005];
int m;
int Dis()
{
int i,j,k;
memset(vis,0,sizeof(vis));
for(i=0;i<=m;i++)
c[i]=a[0][i];
c[0]=0;
vis[0]=1;//做标记,已选过的节点防止再选
for(i=0;i<=m;i++)
{  int min=MAX;
if(!vis[i]&&c[i]<min)//在该节点的众多边中,选择权值最低的
{
k=i;
min=c[i];
}
vis[k]=1;//做标记,已选过的节点防止再选
for(j=0;j<=m;j++)//以选中的边为入度的节点放进去
{
if(!vis[j]&&c[j]>c[k]+a[k][j])
c[j]=c[k]+a[k][j];
}
}

return c[m];
}
int main(){
int T,S,D;
while(~scanf("%d%d%d",&T,&S,&D))
{
memset(a,MAX,sizeof(a));
int i,c1,c2,c3;
m=0;
for(i=0;i<T;i++)
{
scanf("%d%d%d",&c1,&c2,&c3);
a[c1][c2]=c3;
a[c2][c1]=c3;
if(c1>m) m=c1;
if(c2>m) m=c2;
}
m++;//多加一个作为终点
for(i=0;i<S;i++)
{
scanf("%d",&c1);
a[0][c1]=0;
a[c1][0]=0;
}
for(i=0;i<D;i++)
{
scanf("%d",&c1);
a[m][c1]=0;
a[c1][m]=0;
}
printf("%d\n",Dis());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: