hdu
来源:互联网 发布:apache 目录访问控制 编辑:程序博客网 时间:2024/04/27 22:25
ProblemDescription
虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
Input
输入数据有多组,每组的第一行是三个整数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个数,表示草儿想去地方。
Output
输出草儿能去某个喜欢的城市的最短时间。
SampleInput
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
SampleOutput
9
题目大意:
在一个城市里,有很多的站点,草儿想从家里到这些站点中的某些站点,有几个站点里草儿家比较近,她会考虑先到这几个站点,再到其他站点,最终到达她想要去的站点,问,在她达到的站点中,哪个站点她用时最少。
这是一道求两个点的最短路径问题,即:寻找单源最短路径问题,利用dijkstra算法求解,代码如下:
#include <stdio.h>
#define M 1000000
int cost[1000][1000] ;
int max(int a, int b)
{
if(b > a)
returnb ;
return a ;
}
int dijkstra(int n)
{
int i, j, d,min, visit[1000], dist[1000] ;
for(i = 0; i<= n; i++)
dist[i]= cost[0][i] ;
memset(visit,0, sizeof(visit)) ;
visit[0] = 1;
for(i = 0; i< n; i++)
{
min =M ;
for(j= 0; j <= n; j++)
{
if(!visit[j]&& dist[j] < min)
{
min= dist[j] ;
d= j ;
}
}
visit[d]= 1 ;
for(j= 0; j <= n; j++)
{
if(!visit[j]&& dist[d] + cost[d][j] < dist[j])
dist[j]= dist[d] + cost[d][j] ;
}
}
returndist[n] ;
}
int main()
{
int t, s, d,i, j, a, b, end, time, ss[1000], dd[1000] ;
while(scanf("%d%d %d", &t, &s, &d) != EOF)
{
end =0 ;
for(i= 0; i < 1000; i++)
{
for(j= 0; j < 1000; j++)
cost[j][i]= cost[i][j] = M ;
}
for(i= 1; i <= t; i++)
{
scanf("%d%d %d", &a, &b, &time) ;
if(cost[a][b]== 0)
cost[a][b]= cost[b][a] = time ;
elseif(time < cost[a][b])
cost[a][b]= cost[b][a] = time ;
if(end< max(a, b))
end= max(a, b) ;
}
for(i= 1; i <= s; i++)
{
scanf("%d",&ss[i]) ;
cost[0][ss[i]]= 1 ;
cost[ss[i]][0]= 1 ;
}
end++;
for(i= 1; i <= d; i++)
{
scanf("%d",&dd[i]) ;
cost[end][dd[i]]= 1 ;
cost[dd[i]][end]= 1 ;
}
printf("%d\n",dijkstra(end)-2) ;
}
return 0 ;
}
Dijkstra算法是用来查找单源最短路径问题的,即一个点到达另一个点的最短路径,但这个题目寻找的是部分点到达部分点的最短路径,比如寻找3个点到达另外4个点的最短距离,我们可以遍历起始的3个点,当然,我们也可以给这些点的集合中加两个点,起始点0和终止点end,定义0点距离草儿家近的点的距离为1,end点距离她想要到达的点的距离为1,然后通过dijkstra直接寻找0点到end的最短距离即可。
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 动态密码(批处理+vbs)
- Hive 用户自定义函数UDF详解
- 智能家居产业预测:2015年将是关键年
- 方法可以复制 AngularJS资源集合
- python中的descriptor
- hdu
- 第16周项目2-用指针玩字符串(计算单词的个数-指针作形参)
- 第16周oj项目2
- magento 后台订单grid表获取shipping_description
- 第十六周 Problem B:有相同的数字
- 腾讯2014实习生4月20日笔试题(分析与解答)
- 关于Android ListView 多ItemView的问题
- matlab练习程序(k-means聚类)
- Java I/O Overview