1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> using namespace std; #define MAXN 220 #define INF 0x3f3f3f3f
int n, m; int dis[MAXN]; int vis[MAXN]; int mp[MAXN][MAXN]; int A, B;
void dijkstra(int A) { memset(vis, 0, sizeof(vis)); memset(dis, INF, sizeof(dis)); dis[A] = 0; for(int i = 1; i <= n; i++){ int MinNumber, Min = INF; for(int j = 1; j <= n; j++) if(!vis[j] && dis[j] < Min){ Min = dis[j]; MinNumber = j; } vis[MinNumber] = 1; for(int j = 1; j <= n; j++){ dis[j] = min(dis[j], dis[MinNumber] + mp[MinNumber][j]); } } }
int main() { int k; while(scanf("%d", &n) &&n){ scanf("%d %d", &A, &B); memset(mp, INF, sizeof(mp)); for(int i = 1; i <= n; i++){ scanf("%d", &k); if(i - k >= 1) mp[i][i - k] = 1; if(i + k <= n) mp[i][i + k] = 1; } dijkstra(A); if(dis[B] != INF) printf("%d\n", dis[B]); else printf("-1\n"); }
return 0; }
|