HDU 1548 A strange lift(最短路)

本文介绍了一种利用最短路径算法解决楼层间导航问题的方法。通过建立楼层之间的连接边,并使用Dijkstra算法计算从起点到终点的最短路径,适用于需要快速寻找最优路径的场景。代码实现中采用了邻接表存储方式,优先队列优化搜索过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:对两个可互相到达的楼层建边,跑最短路

#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int N=2e2+5;
const int Inf=1e9;
typedef pair<int,int> P;
vector<P> vec[N];
inline void add(int x,int y){
    vec[x].push_back(P(1,y));
}
int Dijstra(int u,int v,int n){
    int dis[N],vis[N];
    for(int i=1;i<=n;i+=1){
        dis[i]=Inf;
        vis[i]=false;
    }
    dis[u]=0;
    priority_queue<P,vector<P>,greater<P> >que;
    que.push(P(0,u));
    while(!que.empty()){
        int x=que.top().second;
        que.pop();
        if(vis[x]) continue;
        vis[x]=1;
        for(auto e:vec[x]){
            int to=e.second;
            int di=e.first;
            if(dis[to]>dis[x]+di){
                dis[to]=dis[x]+di;
                que.push(P(dis[to],to));
            }
        }
    }
    return dis[v]!=Inf?dis[v]:-1;
}
int f[N];
int main(){
    int n,A,B;
    while(~scanf("%d",&n)){
        if(!n) break;
        scanf("%d%d",&A,&B);
        for(int i=1;i<=n;i+=1){
            scanf("%d",&f[i]);
            vec[i].clear();
        }
        for(int i=1;i<=n;i+=1){
            if(!f[i]) continue;
            if(i+f[i]<=n) add(i,i+f[i]);
            if(i-f[i]>=1) add(i,i-f[i]);
        }
        printf("%d\n",Dijstra(A,B,n));
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值