题目链接:点击打开链接
题意:一部电梯,在第i层可以向上或向下Ki层(如果i+Ki<=N或i-Ki>=1),问最少多少次上下可从A层到B层,到不了则输出-1
构图后就变成水题了。若从x层可到y层,则添加一条x到y权值为1的路。本题输出就是A到B的最短路。等于inf就输出-1、
代码:
#include <iostream>
#include <cstring>
using namespace std;
#define inf 10000000LL
int a[300][300];
int n,m,ans;
bool vis[300];
int dis[300];
void dijkstra(int src){
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
dis[i]=a[src][i];
}
vis[src]=1;
for(int i=1;i<n;i++){
int tmp=inf;int k=src;
for(int j=1;j<=n;j++){
if(vis[j])continue;
if(tmp>dis[j]){
tmp=dis[j];
k=j;
}
}
vis[k]=1;
for(int j=1;j<=n;j++){
if(vis[j])continue;
dis[j]=min(dis[j],dis[k]+a[k][j]);
}
}
}
int main(){
while(cin>>n,n){
memset(a,0x7f,sizeof(a));
int A,B;
cin>>A>>B;
int t;
for(int i=1;i<=n;i++){
a[i][i]=0;
cin>>t;
if(i+t<=n)
a[i][i+t]=1;
if(i-t>=1)
a[i][i-t]=1;
}
dijkstra(A);
if(dis[B]>=inf)
cout<<"-1"<<endl;
else
cout<<dis[B]<<endl;
}
return 0;
}