hdu 1548 A strange lift(最短路或DFS)

题目:

        链接:点击打开链接

题意:

思路:

        这也是最短路径的问题,与以往的最短路径有所不同,开始时一看是让求步数,以为是搜索题,就用广搜做,也运行对了,但是提交不上,说的是使用内存超出限制,所以得用其他法,这题首先要做的是把在某一层向上向下能一步到达的层数用数组对应起来,然后就是dijkstra算法求最短路径了。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 10000000

const int N = 220;

int n,a,b;
int dis[N],w[N][N];
int k[N];

void dijkstra()
{
    int v[N];
    memset(v,0,sizeof(v));
    for(int i=1; i<=n; i++)
        dis[i] = w[a][i];
    dis[a] = 0;
    for(int i=1; i<n; i++)
    {
        int x,m = INF;
        for(int y=1; y<=n; y++)
        {
            if(!v[y] && dis[y] < m)
                m = dis[x=y];
        }
        if(m == INF)
            return ;
        v[x] = 1;
        for(int y=1; y<=n; y++)
        {
            if(dis[y] > dis[x] + w[x][y])
                dis[y] = dis[x] + w[x][y];
        }
    }
}

int main()
{
    //freopen("input.txt","r",stdin);
    while(scanf("%d",&n) != EOF && n)
    {
        scanf("%d%d",&a,&b);
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
                w[i][j] = INF;
        }
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&k[i]);
            if(i + k[i] <= n)
                w[i][i+k[i]] = 1;
            if(i - k[i] >=1)
                w[i][i-k[i]] = 1;
        }
        dijkstra();
        printf("%d\n",dis[b] < INF ? dis[b] : -1);
    }
    return 0;
}

---------------------------------------------

战斗,从不退缩;奋斗,永不停歇~~~~~~~~~~~~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值