标签:
5 1 5 3 3 1 2 5 0
3
n代表楼梯层数,A代表起始位置,B代表终止位置,接下来有n个数,代表到达每一层后,可以选择按 按钮“UP”,“DOWN” ,代表执行此操作后电梯可上升或下降的层数(注意:是变化的层数,且合法),问你至少需要按多少次按钮?
此题看起来有一点复杂,但转化一下就变得简单了。以每一层及其可到达的楼层为顶点建立有向图,并把其权值设为1,此问题即可住转化为从起点到终点的最短路径。
我用Dijkstra算法WA,难道有负权?此题也有人用BFS解决的。
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int INF=0x3f3f3f3f;
int a[205][205];
int dis[205];
bool vis[205];
int s,t,n;
void spfa()
{
for(int i=1;i<=n;i++)
{
dis[i]=INF;
vis[i]=false;
}
dis[s]=0;
vis[s]=true;
queue<int>q;
q.push(s);
while(!q.empty())
{
int p=q.front();
q.pop();
vis[p]=true;
for(int i=1;i<=n;i++)
{
if(dis[i]>dis[p]+a[p][i])
{
dis[i]=dis[p]+a[p][i];
if(!vis[i])
{
vis[i]=true;
q.push(i);
}
}
}
}
}
int main()
{
while(cin>>n,n)
{
cin>>s>>t;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
if(i==j)a[i][j]=0;
else a[i][j]=INF;
}
int x;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(i-x>=1) a[i][i-x]=1;
if(i+x<=n) a[i][i+x]=1;
}
spfa();
if(dis[t]>=INF)
cout<<"-1"<<endl;
else
cout<<dis[t]<<endl;
}
return 0;
}
HDU 1548 A strange lift【不错的最短路,spfa】
标签:
原文地址:http://blog.csdn.net/hurmishine/article/details/52056515