EOJ-2124 Seamild的电梯

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 }
View Code

 

posted on 2013-06-12 03:25  KimKyeYu  阅读(150)  评论(0编辑  收藏  举报

导航