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 }

 

 

 

posted @ 2012-07-02 19:05  Naix_x  阅读(177)  评论(0)    收藏  举报