一个人的旅行

来源:互联网 发布:修改虚拟网卡mac地址 编辑:程序博客网 时间:2024/05/16 11:26

问题 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 31 3 51 4 72 8 123 8 44 9 129 10 21 28 9 10

样例输出

9
这道题具有多个起点,而Dijkstra主要特点是以起始点为中心向外层层扩展, 直到扩展到终点为止,这里可以扩展一下,把草儿家乡作为起点,起点与邻边城市相连, 距离,开车时间都为零。因为终点也不确定,再设一个终点,使其原本终点(想去的城市) 到我们设的终点为零,城市从1开始,所以起点可为0,终点为最大城市编号+1
# include<stdio.h># include<string.h># define MAX 0x3f3f3fint 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;} 


原创粉丝点击