【A*算法——清晰解析 算法逻辑——算法可以应用到哪些题目】例题1.第K短路

news2024/10/7 2:20:10

A*算法

        • A*算法是什么
        • 例题1. 第K短路
            • 题意解析

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
 
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
 
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!

A*算法是什么

在这里插入图片描述
比如如图,我们要搜索从起点到终点的最小距离

起点 一共连接6条边,

我们如果通过 起点的6条边 bfs 搜索 终点

万一搜索的第一挑边是 左上角那条,那么接下来的bfs会优先走这一条,但是这一条如果连接了 特比多边,就会导致,我们的算法时间复杂度非常大

那么我们优化办法就来了,就是

优先走 起点6条边中的 距离终点较 短的 路

怎么实现呢?

我们先从终点往外遍历,记录所有边到终点的距离,那么我们就会知道
起点的6条边中,哪一条边 距离终点较近

优先遍历这条就是了

以上就是A*算法的逻辑
也就是需要 预先处理一下 所有边到终点的最短距离(直接从终点开始遍历)

例题1. 第K短路

原题链接

题意解析

本题求A点到B点
路径长度排名第K 的 路径长度大小 是多少

我们画图自己简单分析一下,可以得出
A点到B点 会有非常非常多的路径走法

那么具体走哪些部分呢?

那就是 先走 距离B较小的路径部分
那么就用到了A*算法思想

我们先预处理一下,B点到所有点的最短距离

然后从A开始走,A点会连接很多点,但是先走 距离A点+距离B点 总和较小的点

如果走到了B那么就不再继续走

但是别的路径还是继续走

直到走到B为K次,那么

此时的路径就是 第K长度

#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;
typedef pair<int, PII> PIII;
const int N = 1010, M = 200010;

int n, m, S, T, K;
int h[N], rh[N], e[M], w[M], ne[M], idx;
int dist[N], cnt[N];
bool st[N];

void add(int h[],int a,int b,int c)
{
    e[idx] = b;
    w[idx] = c;
    ne[idx] = h[a];
    h[a] = idx++;
}

void dijkstra()
{
    priority_queue<PII,vector<PII>,greater<PII>> heap;
    heap.push({0,T});//终点
    memset(dist, 0x3f, sizeof dist);
    dist[T] = 0;

    while(heap.size())
    {
        auto t = heap.top();
        heap.pop();

        int ver = t.y;
        if(st[ver]) continue;
        st[ver] = true;

        for(int i=rh[ver];i!=-1;i=ne[i])
        {
            int j = e[i];
            if(dist[j]>dist[ver]+w[i])
            {
                dist[j] = dist[ver] + w[i];
                heap.push({dist[j],j});
            }
        }
    }
}

int astar()
{
    priority_queue<PIII, vector<PIII>, greater<PIII>> heap;
    // 谁的d[u]+f[u]更小 谁先出队列
    heap.push({dist[S], {0, S}});
    while(heap.size())
    {
        auto t = heap.top();
        heap.pop();
        int ver = t.y.y,distance = t.y.x;
        cnt[ver]++;
        //如果终点已经被访问过k次了 则此时的ver就是终点T 返回答案

        if(cnt[T]==K) return distance;

        for(int i=h[ver];i!=-1;i=ne[i])
        {
            int j = e[i];
            /* 
            如果走到一个中间点都cnt[j]>=K,则说明j已经出队k次了,且astar()并没有return distance,
            说明从j出发找不到第k短路(让终点出队k次),
            即继续让j入队的话依然无解,
            那么就没必要让j继续入队了
            */
            if(cnt[j] < K)
            {
                // 按 真实值+估计值 = d[j]+f[j] = dist[S->t] + w[t->j] + dist[j->T] 堆排
                // 真实值 dist[S->t] = distance+w[i]
                heap.push({distance+w[i]+dist[j],{distance+w[i],j}});
            }
        }
    }
    // 终点没有被访问k次
    return -1;
}

int main()
{
    cin >> m >> n;
    memset(h,-1,sizeof h);
    memset(rh,-1,sizeof rh);
    for(int i=0;i<n;i++)
    {
        int a,b,c;
        cin >> a >> b >> c;
        add(h,a,b,c);
        add(rh,b,a,c);
    }
    cin >> S >> T >> K;
    // 起点==终点时 则d[S→S] = 0 这种情况就要舍去 ,总共第K大变为总共第K+1大 
    if (S == T) K ++ ;
    // 从各点到终点的最短路距离 作为估计函数f[u]
    dijkstra();
    cout << astar();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/529715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

栈和队列的实现

栈 栈的概念 栈也是线性表的一种&#xff0c;但是栈只允许在固定的一端进行插入与删除数据&#xff0c;而进行插入与删除的一端同意称为栈顶&#xff0c;而另一端就称为栈底。简称&#xff1a;后进先出。 压栈&#xff08;push&#xff09;&#xff1a;将数据插入栈顶。 出…

C++进阶——AVL树的构建

C进阶——AVL树的构建 AVL树 概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当 于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landi…

2023Python最火的第三方开源测试框架 ——pytest

一、介绍 本篇文章是介绍的是Python 世界中最火的第三方单元测试框架&#xff1a;pytest。 它有如下主要特性&#xff1a; assert 断言失败时输出详细信息&#xff08;再也不用去记忆 self.assert* 名称了&#xff09;自动发现测试模块和函数模块化夹具用以管理各类测试资源对…

顺序表,让数据有序飞舞:C语言实现全攻略

本篇博客会讲解顺序表这种数据结构的相关知识&#xff0c;并且使用C语言实现一个顺序表。 概述 什么是顺序表呢&#xff1f;顺序表是一种线性的数据结构&#xff0c;其特点是&#xff1a;数据是从第一个位置开始&#xff0c;连续存放的。其实&#xff0c;你完全可以把它等价于…

哈工大软件过程与工具作业3

哈尔滨工业大学 计算学部/软件学院 2022年秋季学期 2020级本科《软件过程与工具》课程&#xff08;3.0学分&#xff09; 作业报告 作业3&#xff1a;软件测试报告 姓名 学号 联系方式 石卓凡 120L021011 944613709qq.com/18974330318 目 录 1 作业目的与要求...........…

《计算机网络—自顶向下方法》 Wireshark实验(七):以太网与ARP协议分析

1 以太网 1.1 介绍 以太网是现实世界中最普遍的一种计算机网络。以太网有两类&#xff1a;第一类是经典以太网&#xff0c;第二类是交换式以太网&#xff0c;使用了一种称为交换机的设备连接不同的计算机。 经典以太网&#xff1a;是以太网的原始形式&#xff0c;运行速度从 …

股价与期待值“背道而驰”,友车科技能否站稳科创板?

上周&#xff0c;共计7只新股登陆A股&#xff0c;其中&#xff0c;用友汽车信息科技&#xff08;上海&#xff09;股份有限公司&#xff08;以下简称友车科技&#xff09;于5月11日在科创板上市。发行价为33.99元&#xff0c;发行3607.94万股&#xff0c;募资总额为12.24亿元。…

jmeter接口测试项目实战详解,零基础也能学,源码框架都给你

目录 1.什么是jmeter&#xff1f; 2.jmeter能做什么&#xff1f; 3.jmeter环境搭建 3.1前提&#xff1a; 3.2jmeter下载&#xff1a; 3.3jmeter环境搭建&#xff1a; 3.3.1mac当中jmeter环境搭建&#xff1a; 3.4jmeter基本配置 3.4.1.切换语言 3.4.2.安装插件 4.jmet…

MySQL数据库基础2

文章目录 数据类型表的约束 数据类型 1、数值类型&#xff1a;BIT、TINYINT、BOOL、SMALLINT、INT、BIGINT、FLOAT[(M,D)]、DOUBLE[(M,D)]、DECIMAL[(M,D)] FLOAT[(M,D)]&#xff1a;占用四个字节&#xff0c;M表示显示位数&#xff0c;D表示小数位数&#xff0c;精度保证&am…

5年测试,已失业3个月.....

我做测试5年&#xff0c;一线城市薪水拿到15K&#xff0c;中间还修了一个专升本&#xff0c;这个年限不说资深肯定也是配得上经验丰富的。今年行情不好人尽皆知&#xff0c;但我还是对我的薪水不是很满意&#xff0c;于是打算出去面试&#xff0c;希望可以搏一个高薪。 但真到面…

测试自动化工具_Katalon

测试自动化_Katalon 1.概述 ​ Katalon界面的自动化测试工具&#xff0c;简称KS&#xff0c;于2015年推出。是开源的&#xff0c;提供的版本有免费的版本&#xff0c;还有企业版是收费的。如下图。其中的服务台功能应该是持续继承的支持。可试用一个月。 ​ 最初是支持Web UI…

Chatgpt论文笔记——MiNiGPT4解读

前言 代码地址&#xff1a;https://github.com/Vision-CAIR/MiniGPT-4 摘要 摘要写的就很简单了&#xff0c;标黄的是重点&#xff0c;可以看到这个方法很简单&#xff0c;就是拿了一个视觉的encoder&#xff08;Blip-2&#xff09;以及拿了一个文本的encoder&#xff08;Vic…

OpenPCDet系列 | 5.2 PointPillars算法——PointPillarScatter伪图像BEV特征构建模块

文章目录 PointPillarScatter模块1. PointPillarScatter初始化2. PointPillarScatter前向传播 OpenPCDet的整个结构图&#xff1a; PointPillarScatter模块 在进行了PillarVFE编码后&#xff0c;此时的batch_dict更新如下所示&#xff0c;追加了pillar_features字段&#xf…

好程序员:转行学Java怎么样?什么工作可以月入过万?

去年的时候有个学妹跟小源说&#xff0c;想转行&#xff0c;但是目前又比较迷茫&#xff0c;不知道该从事啥行业&#xff1f;她跟小源说了下具体情况&#xff0c;本科学历&#xff0c;Java零基础。小源让好程序员的就业老师跟她分享了下相关的it行业规划&#xff0c;最后她学了…

Python实现ACO蚁群优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

关于摄影艺术欣赏分享(私密空间+玛丽娜·阿布拉莫维奇+世界十大最昂贵的摄影作品欣赏+《死亡路上的对话》+马良作品)

文章的内容灵感是旁听课而来的呀&#xff0c;搜了很多相关文章很喜欢 1. 出去遛狗&#xff0c;晚点回来 国外文化中国文化&#xff08;国外不可以随意拍摄照片&#xff09; 公共空间私密空间 艺术的价值在于可以给人们思考&#xff0c;颠覆常识 2. 行为艺术之母玛丽娜阿布拉…

YOLOv5【目录结构源码】超详细注释解读!!!建议收藏✨✨!

上一篇文章介绍了YOLOv5的网络的详细解读&#xff1a;直通车&#x1f680; 由于以后的学习及在进行的项目打算YOLOv5再仔细研究进行使用及改进&#xff0c;接下来会出相关于YOLOv5的代码逐行解读以及注释&#xff0c;废话不多说&#xff0c;让我们一起学习YOLOv5源码吧&#xf…

CTFshow pwn03

题目&#xff1a; 在做本道题前&#xff0c;我们先了解所必要的知识 Libc是什么&#xff1f; 英文名字&#xff1a;Standard C library&#xff0c;其翻译过来&#xff0c;C语言标准库 它是符合ANSI C标准的一个函数库 学过C语言会明白 ANSI C标准又是什么&#xff1f; 198…

Redo log

目录标题 前言为什么需要redo log redo log中的WAL&#xff08;先写日志&#xff0c;再写磁盘&#xff09;重要参数innodb_flush_log_at_trx_commit如何选择 redo log记录形式日志块(log block)redo log的格式 redo log何时刷入磁盘正常关闭服务器时事务提交时&#xff08;inno…

【STL】string的使用

放在专栏【C知识总结】&#xff0c;会持续更新&#xff0c;期待支持&#x1f339; STL简介 STL的诞生 STL为英文Standard Template Library的缩写&#xff0c;译为标准模板库。是C标准库的重要组成部分。 长久以来&#xff0c;软件届一直希望建立一种可重复运用的东西。所谓…