<span style="font-size:18px;">
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1548
<span style="color:#33cc00;">//该题就是标准的Dijkstra算法,只要套用一下模板就可以了,中间的改动处也就dist[A]=0</span>
#include<iostream>
using namespace std;
const int Max=201,MAX_X=10000;
bool visited[Max];
int map[Max][Max];
int dist[Max];
void Dijkstra(int N,int A,int B)
{
int i,j,k;
fill(visited,visited+Max,false);
for(i=1;i<=N;i++)dist[i]=map[A][i];
dist[A]=0;<span style="color:#33cc00;">//这样写可以避免接下来考虑A=B的情况,知识找k的for多进行了一次</span>
visited[A]=true;
for(i=1;i<=N-1;i++)
{
int min=INT_MAX;
for(j=1;j<=N;j++)
{
if(visited[j]==false&&dist[j]<min)
{
min=dist[j];
k=j;
}
}
visited[k]=true;
if(k==B)return ;<span style="color:#33cc00;">//找到结束点</span>
for(int w=1;w<=N;w++)
{
if(visited[w]==false&&dist[w]>dist[k]+map[k][w])
{
dist[w]=dist[k]+map[k][w];
}
}
}
}
int main()
{
int N;
while(cin>>N)
{
if(N==0)break;
int A,B,i,k;
cin>>A>>B;
fill(&map[0][0],&map[Max-1][Max-1]+1,MAX_X);
for(i=1;i<=N;i++)<span style="color:#33cc00;">//此处为邻接矩阵的创建,map的值赋为1表示之间能够到达,之后会附上题中示例的图结构</span>
{
cin>>k;
if(i+k<=N)
map[i][i+k]=1;
if(i-k>=1)
map[i][i-k]=1;
}
Dijkstra(N,A,B);
if(dist[B]<MAX_X)
cout<<dist[B]<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}