hdu 1548 A strange lift (dijkstra算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548

题目大意:升降电梯,先给出n层楼,然后给出起始的位置,即使输出从A楼道B楼的最短时间。

注意的几点

(1)每次按一下,只能表示上或者是下,然后根据输入的看是上几层或者是下几层。

(2)注意不能到底不存在的楼层。

详见代码。

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 const int INF=9999999;
 5 int map[205][205],node[205],vis[205],Min,n;
 6 
 7 void set()
 8 {
 9     for (int i=1; i<=n; i++)
10     {
11         vis[i]=0;
12         node[i]=INF;
13         for (int j=1; j<=n; j++)
14             map[i][j]=INF;
15     }
16 }
17 
18 int dijkstra(int m,int end)
19 {
20     int tm=m;
21     vis[m]=1;
22     node[m]=0;
23     for (int k=2; k<=n; k++)
24     {
25         Min=INF;
26         for (int i=1; i<=n; i++)
27             if (!vis[i])
28             {
29                 if (node[i]>node[tm]+map[tm][i])
30                     node[i]=node[tm]+map[tm][i];
31                 if (Min>node[i])
32                 {
33                     Min=node[i];
34                     m=i;
35                 }
36             }
37         vis[m]=1;
38         tm=m;
39         if(vis[end])
40             return node[end];
41     }
42     return -1;
43 }
44 
45 int main ()
46 {
47     int k;
48     while (scanf("%d",&n),n)
49     {
50         set();
51         int a,b;
52         scanf("%d%d",&a,&b);
53         for (int i=1; i<=n; i++)
54         {
55             scanf("%d",&k);
56             if (i+k<=n)
57                 map[i][i+k]=1;
58             if (i-k>=1)
59                 map[i][i-k]=1;
60         }
61         printf ("%d
",dijkstra(a,b));
62     }
63     return 0;
64 }
原文地址:https://www.cnblogs.com/qq-star/p/3913008.html