题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1548
本题为简单最短路,构图方法为如果在第i层可以上升Ki层则增加边i - >(i+Ki) 否则不加边,如果可以下降Ki层则增加边i-> (i - Ki)
#include<iostream>
#include<queue>
#include<string>
using namespace std;
#define maxn 205
#define INF (1<<30)
struct node
{
int v;
node *next;
}*head[maxn],edge[maxn*maxn];
int n,dis[maxn];
bool vis[maxn];
void spfa(int start)
{
for(int i = 0; i <= n; i++)
dis[i] = INF;
memset(vis,false,sizeof(vis));
vis[start] = true;
dis[start] = 0;
queue<int>que;
que.push(start);
while(!que.empty())
{
int now = que.front();
vis[now] = true;
que.pop();
for(node *p = head[now]; p; p = p->next)
{
if(dis[p->v] > dis[now] + 1)
{
dis[p->v] = dis[now] + 1;
if( !vis[p->v])
{
vis[p->v] = true;
que.push(p->v);
}
}
}
}
}
int main()
{
int s,e,i,K;
while(cin >> n,n)
{
cin >> s >> e;
for( i = 0; i <= n; i++)
head[i] = NULL;
node *p = edge;
for(i = 1; i <= n; i++)
{
scanf("%d",&K);
if(i - end >= 1)//如果可以下降K层则增加边i -> i - K
{
p->v = i - K;
p->next = head[i];
head[i] = p++;
}
if(i + end <= n) //如果可以上升K层则增加边i -> i+K
{
p->v = i + K;
p->next = head[i];
head[i] = p++;
}
}
spfa(s);
if(dis[e] == INF)
printf("-1\n");
else
printf("%d\n",dis[e]);
}
return 0;
}