题目大意:有一个升降机,它有两个按钮UP和DOWN,给你一些数i表示层数,并且每层对应的Ki,如果按UP按钮,会从第i层升到第i+Ki层;如果按了DOWN则会从第i层降到第i-Ki层;并规定能到的层数为1到N,现在的要求就是给你N,A,B和一串数K1到Kn,问你从A到B,至少按几下按钮。
构造一个图,边的权值为1
Sample Input
5 1 5 //层数 起点 终点
3 3 1 2 5
0
Sample Output
3
Dijkstra:
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # define LL long long 7 using namespace std ; 8 9 const int MAXN=300; 10 const int INF=0x3f3f3f3f; 11 int n ; 12 bool vis[MAXN]; 13 int cost[MAXN][MAXN] ; 14 int lowcost[MAXN] ; 15 int pre[MAXN]; 16 void Dijkstra(int beg) 17 { 18 for(int i=0;i<n;i++) 19 { 20 lowcost[i]=INF;vis[i]=false;pre[i]=-1; 21 } 22 lowcost[beg]=0; 23 for(int j=0;j<n;j++) 24 { 25 int k=-1; 26 int Min=INF; 27 for(int i=0;i<n;i++) 28 if(!vis[i]&&lowcost[i]<Min) 29 { 30 Min=lowcost[i]; 31 k=i; 32 } 33 if(k==-1) 34 break ; 35 vis[k]=true; 36 for(int i=0;i<n;i++) 37 if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]) 38 { 39 lowcost[i]=lowcost[k]+cost[k][i]; 40 pre[i]=k; 41 } 42 } 43 44 } 45 46 47 48 int main () 49 { 50 // freopen("in.txt","r",stdin) ; 51 52 while (scanf("%d" , &n ) !=EOF) 53 { 54 if (n==0) 55 break ; 56 int i , j ; 57 for (i = 0 ; i < n ; i++) 58 for (j = 0 ; j < n ; j++) 59 cost[i][j] = INF ; 60 int s , e , t; 61 scanf("%d %d" , &s , &e) ; 62 for (i = 0 ; i < n ; i++) 63 { 64 scanf("%d" , &t) ; 65 if (i + t <= n-1) 66 cost[i][i+t] = 1 ; 67 if (i - t >= 0) 68 cost[i][i-t] = 1 ; 69 } 70 Dijkstra(s-1) ; 71 if (lowcost[e-1] != INF) 72 printf("%d\n" , lowcost[e-1]) ; 73 else 74 printf("-1\n") ; 75 } 76 77 return 0 ; 78 }
时间: 2024-11-05 06:14:13