题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1548
题目大意:电梯固定每次可上下层数,问最短路
解题思想:Dijkstra
代码:
#include <iostream>
#include <stdio.h>#include <stdlib.h>
#include <algorithm>
using namespace std;
#define inf 0x7f7f7f
#define maxn 250
int dis[maxn],map[maxn][maxn],buttom[maxn];
int n;
bool vis[maxn];
void Dijkstra(int start,int finish)
{
for(int i=1;i<=n;i++ )
{
vis[i]=false;
dis[i]=map[start][i];
}
vis[start]=true;
dis[start]=0;
int temp,k;
for(int i=1 ; i<=n ; i++ )
{
temp=inf;
for( int j=1;j<=n;j++)
{
if(!vis[j]&&temp>dis[j])
temp = dis[k=j];
}
if(temp==inf)break;
vis[k]=true;
for(int j=1;j<=n;j++ )
if(!vis[j]&&dis[j]>map[k][j]+dis[k])dis[j]=map[k][j]+dis[k];
}
}
int main()
{
int start,finish;
while(scanf("%d",&n)&&n!=0)
{
scanf("%d%d",&start,&finish);
for(int i=1;i<=n;i++ )
for(int j=1;j<=n;j++ )
map[i][j]=inf;
for(int i=1;i<=n;i++ )
{
scanf("%d",&buttom[i]);
if(i+buttom[i]<=n)map[i][i+buttom[i]]=1;
if(i-buttom[i]>=1)map[i][i-buttom[i]]=1;
}
Dijkstra(start,finish );
if(dis[finish]==inf )printf("-1\n");
else printf("%d\n",dis[finish]);
}
return 0;
}