http://acm.cs.ecnu.edu.cn/problem.php?problemid=2124
题意,电梯第i层能上升Ki层或下降Ki层,问从a到b的最短操作次数
最短路floyd,建图时即是把x到x+ki x-ki (若存在)赋值为1,开始存为inf。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int mat[105][105]; 6 const int inf=99999999; 7 void floyd(int n){ 8 for(int k=1;k<=n;k++) 9 for(int i=1;i<=n;i++) 10 for(int j=1;j<=n;j++) 11 if(mat[i][k]+mat[k][j] < mat[i][j]) 12 mat[i][j]=mat[i][k]+mat[k][j]; 13 } 14 int main(){ 15 int n,a,b; 16 while(scanf("%d%d%d",&n,&a,&b)!=EOF){ 17 18 for(int i=1;i<=n;i++) 19 for(int j=1;j<=n;j++) 20 mat[i][j]=inf; 21 for(int i=1;i<=n;i++){ 22 int x; 23 scanf("%d",&x); 24 if(i-x>0) mat[i][i-x]=1; //建图 25 if(i+x<=n) mat[i][i+x]=1; 26 } 27 if(a==b){cout<<"0"<<endl;continue;} //特判一下 28 floyd(n); 29 if(mat[a][b]<inf)cout<<mat[a][b]<<endl; 30 else cout<<"-1"<<endl; //不连通,无法到达 31 } 32 return 0; 33 }