I.cpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ONLINE_JUDGE
  4. const int inf = 0x7fffffff;
  5. struct Edge {
  6. int from, to, nxt;
  7. } e[505];
  8. int idx, n, a, b, d[205], head[205];
  9. void addedge(int from, int to) {
  10. e[idx].from = from;
  11. e[idx].to = to;
  12. e[idx].nxt = head[from];
  13. head[from] = idx++;
  14. }
  15. void Bellman_Ford() {
  16. int i, j;
  17. for (i = 1; i <= n; ++i) {
  18. d[i] = inf;
  19. }
  20. d[a] = 0;
  21. for (i = 1; i <= n - 1; ++i) {
  22. for (j = 0; j < idx; ++j) {
  23. if (d[e[j].from] != inf) {
  24. if (d[e[j].to] > d[e[j].from] + 1) {
  25. d[e[j].to] = d[e[j].from] + 1;
  26. }
  27. }
  28. }
  29. }
  30. if (d[b] == inf)
  31. printf("-1\n");
  32. else
  33. printf("%d\n", d[b]);
  34. }
  35. int main() {
  36. #ifndef ONLINE_JUDGE
  37. freopen("G.in", "r", stdin);
  38. freopen("G.out", "w", stdout);
  39. #endif
  40. int i, tmp;
  41. while (scanf("%d", &n) != EOF) {
  42. if (!n)
  43. break;
  44. scanf("%d%d", &a, &b);
  45. idx = 0;
  46. memset(head, -1, sizeof(head));
  47. for (i = 1; i <= n; ++i) {
  48. scanf("%d", &tmp);
  49. if (i - tmp > 0)
  50. addedge(i, i - tmp);
  51. if (i + tmp <= n)
  52. addedge(i, i + tmp);
  53. }
  54. Bellman_Ford();
  55. }
  56. return 0;
  57. }