HDU 2066 一个人的旅行(地杰斯特拉)
在实训的间隙刷个题。。。裸地杰斯特拉。
1 #include <stdio.h> 2 #include <string.h> 3 #define N 10000000 4 int p[1001][1001]; 5 int main() 6 { 7 int i,j,k,t,s,d,sv,ev,w,min,num,min2,max; 8 int a[1001],o[1001],key[1001]; 9 int low[1001]; 10 while(scanf("%d%d%d",&t,&s,&d)!=EOF) 11 { 12 memset(key,0,sizeof(key)); 13 memset(low,0,sizeof(low)); 14 memset(o,0,sizeof(o)); 15 for(i = 1;i <= 1000;i ++) 16 { 17 for(j = 1;j <= 1000;j ++) 18 p[i][j] = N; 19 p[i][i] = 0; 20 } 21 max = 0; 22 for(i = 1;i <= t;i ++) 23 { 24 scanf("%d%d%d",&sv,&ev,&w); 25 if(p[sv][ev] > w) 26 { 27 p[sv][ev] = w; 28 p[ev][sv] = w; 29 } 30 if(max < sv) 31 max = sv; 32 if(max < ev) 33 max = ev; 34 } 35 for(i = 1;i <= s;i ++) 36 scanf("%d",&a[i]); 37 for(i = 1;i <= d;i ++) 38 { 39 scanf("%d",&j); 40 key[j] = 1; 41 } 42 min2 = N; 43 for(k = 1;k <= s;k ++) 44 { 45 memset(o,0,sizeof(o)); 46 for(i = 1;i <= max;i++) 47 low[i] = p[a[k]][i]; 48 o[a[k]] = 1; 49 for(i = 1;;i ++) 50 { 51 min = N; 52 for(j = 1;j <= max;j ++) 53 { 54 if(min > low[j]&&!o[j]) 55 { 56 min = low[j]; 57 num = j; 58 } 59 } 60 o[num] = 1; 61 if(min == N)break; 62 for(j = 1;j <= max;j ++) 63 { 64 if(low[j] > min +p[num][j]&&!o[j]) 65 low[j] = min + p[num][j]; 66 } 67 } 68 for(j = 1;j <= max;j ++) 69 { 70 if(key[j]) 71 { 72 if(min2 > low[j]) 73 min2 = low[j]; 74 } 75 } 76 } 77 printf("%d\n",min2); 78 } 79 return 0; 80 }

浙公网安备 33010602011771号