HDU 2066 一个人的旅行(地杰斯特拉)
2012-07-02 19:05
363 查看
题目链接
在实训的间隙刷个题。。。裸地杰斯特拉。
在实训的间隙刷个题。。。裸地杰斯特拉。
#include <stdio.h> #include <string.h> #define N 10000000 int p[1001][1001]; int main() { int i,j,k,t,s,d,sv,ev,w,min,num,min2,max; int a[1001],o[1001],key[1001]; int low[1001]; while(scanf("%d%d%d",&t,&s,&d)!=EOF) { memset(key,0,sizeof(key)); memset(low,0,sizeof(low)); memset(o,0,sizeof(o)); for(i = 1;i <= 1000;i ++) { for(j = 1;j <= 1000;j ++) p[i][j] = N; p[i][i] = 0; } max = 0; for(i = 1;i <= t;i ++) { scanf("%d%d%d",&sv,&ev,&w); if(p[sv][ev] > w) { p[sv][ev] = w; p[ev][sv] = w; } if(max < sv) max = sv; if(max < ev) max = ev; } for(i = 1;i <= s;i ++) scanf("%d",&a[i]); for(i = 1;i <= d;i ++) { scanf("%d",&j); key[j] = 1; } min2 = N; for(k = 1;k <= s;k ++) { memset(o,0,sizeof(o)); for(i = 1;i <= max;i++) low[i] = p[a[k]][i]; o[a[k]] = 1; for(i = 1;;i ++) { min = N; for(j = 1;j <= max;j ++) { if(min > low[j]&&!o[j]) { min = low[j]; num = j; } } o[num] = 1; if(min == N)break; for(j = 1;j <= max;j ++) { if(low[j] > min +p[num][j]&&!o[j]) low[j] = min + p[num][j]; } } for(j = 1;j <= max;j ++) { if(key[j]) { if(min2 > low[j]) min2 = low[j]; } } } printf("%d\n",min2); } return 0; }
相关文章推荐
- hdu 2066 一个人的旅行
- HDU 2066:一个人的旅行【Dijkstra & SPFA & Floyd】
- hdu-2066-一个人的旅行
- HDU 2066 一个人的旅行【最短路,多起点多终点,Dijkstra算法+spfa算法】
- hdu 2066 一个人的旅行 Dijkstra+优先队列优化
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行 (单源最短距离)
- HDU 2066 一个人的旅行(最短路)
- 一个人的旅行 (HDU 2066)
- HDU 2066 一个人的旅行(最短路)
- hdu 2066 一个人的旅行(Dijkstra)
- HDU 2066--一个人的旅行【Dijkstra】
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行(Dijkstra)
- HDU2066_一个人的旅行(Dijkstra最短路)
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行 最短路径
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行(最短路&Dijkstra)
- HDU 2066 一个人的旅行 超级起点 多源起点dijkstra