图的导航 - 最短路径算法

news2024/11/27 17:53:49

在这里插入图片描述
一个 恋爱关系图
胡图图love:98于小美
胡图图love:48何壮壮
胡图图love:99小怪
于小美love:10张帅子
何壮壮love:45张帅子
小怪love:100张帅子
胡图图到张帅子的最短路径
确定不是恋爱路径?

算法实现

先看猛料再看是否实现思路

// 定义深度优先搜索状态  
struct DepthFirstSearchFLag {
    int index;        // 当前索引
    bool visited[MaxSize];  // 顶点访问状态
};

// 定义最短路径状态
struct  ShortPathFLag {
    DepthFirstSearchFLag Flag;   // 深度优先搜索状态
    int end;                     // 结束顶点索引
    int stepNum;                 // 步数
    int m_Weight;               // 当前路径权重 
    int ArgsWeight;             // 参数路径权重
    int SevePath[MaxSize];      // 保存路径 
    int ShortPathValue[MaxSize];// 最短路径值
};

// 寻找图中任意两顶点间的最短路径。 
void ShortPath(const Graph& graph, ShortPathFLag& ShortPathFLag) {

    // 获取当前顶点索引和终点索引
    int& index = ShortPathFLag.Flag.index;
    int& end = ShortPathFLag.end;

    // 获取搜索状态
    auto& visited = ShortPathFLag.Flag.visited;  // 记录已访问顶点
    auto& SevePath = ShortPathFLag.SevePath;     // 记录路径
    auto& ShortPaths = ShortPathFLag.ShortPathValue; // 记录最短路径值 
    int& stepNum = ShortPathFLag.stepNum;      // 记录当前步数
    int& ArgsWeight = ShortPathFLag.ArgsWeight;   // 记录当前路径长度
    int& Weight = ShortPathFLag.m_Weight;      // 记录最短路径长度

    // 如果到达终点,更新最短路径并输出
    if (index == end) {
        // 输出当前路径
        for (size_t i = 0; i < stepNum; i++) {
            cout << graph.List[SevePath[i]]->value << " ->";
        }
        // 输出当前路径长度
        cout << "\t该路径对应的恋爱值 (Love)是:" << ArgsWeight << endl;

        // 如果当前路径更短,更新最短路径
        if (Weight > ArgsWeight) {
            Weight = ArgsWeight;
            // 更新最短路径值
            int conut = stepNum * sizeof(conut);
            memcpy(ShortPaths, SevePath, conut);
        }
    }

    // 获取当前顶点的相邻未访问顶点
    int currentIndex = index;
    Edge* current = graph.List[index]->First;
    while (current) {
        currentIndex = current->AdjVertex;
        if (!visited[currentIndex]) {

            // 标记顶点为已访问,更新路径和权重,继续搜索
            visited[currentIndex] = true;
            SevePath[stepNum++] = currentIndex;
            ArgsWeight = ArgsWeight + current->Weight;
            index = currentIndex;
            ShortPath(graph, ShortPathFLag);

            // 搜索返回后重置状态,继续搜索其他相邻顶点
            visited[currentIndex] = false;
            SevePath[--stepNum] = 0;
        }
        current = current->next;
    }

}

// 寻找图中任意两顶点VertexValueFirst和VertexValueSecond间的最短路径。
void ShortPath(const Graph& graph, VertexValue VertexValueFirst, VertexValue VertexValueSecond){
    
    // 初始化搜索状态
    ShortPathFLag Flag{};                  // 搜索状态
    Flag.m_Weight = INT_MAX;              // 初始化最短路径长度为最大值
    const int VertexSize = graph.VertexSize;   // 顶点数
    
    // 获取起点和终点索引
    Flag.Flag.index = Location(graph, VertexValueFirst);  // 起点索引
    Flag.end = Location(graph, VertexValueSecond);      // 终点索引
    
    // 如果起点和终点存在,执行搜索
    if (Flag.Flag.index != VertexSize && Flag.end!= VertexSize) {  

        // 输出搜索信息
        cout << VertexValueFirst << "到" << VertexValueSecond << "最短路径:" << endl; 
        
        // 执行深度优先搜索
        ShortPath(graph, Flag);         
        
        // 输出搜索结果
        cout << endl;
        cout << "最小路径长度为:" << Flag.m_Weight << endl;    // 输出最短路径长度  
        cout << "路径:";

        // 输出最短路径
        auto& Path = Flag.ShortPathValue;   // 最短路径值
        int i = 0;
        while (i < MaxSize && Path[i]>0) {   
            cout << graph.List[Path[i]]->value << " "; 
            i++;
        }
        cout << endl;
    }
}

算法思想

  1. 获取状态信息,包括当前索引、终点索引、步数等。
    int& index = ShortPathFLag.Flag.index;
    int& end = ShortPathFLag.end;
    auto& visited = ShortPathFLag.Flag.visited;
    auto& SevePath = ShortPathFLag.SevePath;
    auto& ShortPaths = ShortPathFLag.ShortPathValue;
    int& stepNum = ShortPathFLag.stepNum;
    int& ArgsWeight = ShortPathFLag.ArgsWeight;
    int& Weight = ShortPathFLag.m_Weight;
  2. 如果到达终点,更新最短路径并输出。
    if (index==end){
    //输出路径
    //更新最短路径
    }
  3. 获取当前顶点的相邻未访问顶点。
    int currentIndex = index;
    Edge* current = graph.List[index]->First;
    while (current) {
    currentIndex = current->AdjVertex;
    if (!visited[currentIndex]){
    //找到相邻未访问顶点
    }
    current = current->next;
    }
  4. 标记顶点为已访问,更新路径和权重,继续搜索。
    visited[currentIndex] = true;
    SevePath[stepNum++] = currentIndex;
    ArgsWeight = ArgsWeight + current->Weight;
    index = currentIndex;
    ShortPath(graph, ShortPathFLag);
  1. 搜索返回后重置状态,继续遍历其他相邻顶点。
    visited[currentIndex] = false;
    SevePath[–stepNum] = 0;

最短路径算法图(更新中,敬请期待)

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

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

相关文章

【Android】WMS(六)Surface的创建和操作

Surface的创建流程 在Android系统中每个Activity都有一个独立的画布&#xff08;在应用侧称为Surface,在SurfaceFlinger侧称为Layer&#xff09;&#xff0c; 无论这个Activity安排了多么复杂的view结构&#xff0c;它们最终都是被画在了所属Activity的这块画布上。 1.Surfac…

618数码好物全推荐,几款科技感满满的数码好物分享

6月18日将迎来一年一度的618狂欢购物节&#xff0c;这可谓是一场精彩绝伦的购物盛宴。每年都有诸多品牌参与其中&#xff0c;我们不仅需要应对复杂的折扣&#xff0c;还需要面对眼花缭乱的产品&#xff0c;这让我们不可避免地陷入了“选择困难症”的困扰中。为了让大家在今年61…

【Android】手持设备规格参数

系列文章 【Android】手持设备规格参数 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/130604517 【H5】avalon前端数据双向绑定 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/131067187 【H5】安卓自动更新方案&…

天空卫士在中国数据安全软件市场位列前五

IDC-中国数据安全软件市场份额&#xff0c;2022 数字经济迅速崛起 中央网信办5月份发布的《数字中国发展报告(2022年)》显示&#xff0c;2022年&#xff0c;我国数字经济规模达50.2万亿元&#xff0c;总量稳居世界第二&#xff0c;同比名义增长10.3%&#xff0c;占国内生产总…

C#,码海拾贝(39)——求解“对称正定方程组”的“共轭梯度法”之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…

vue3 script setup 获取父组件函数与参数方法

<script setup>真的可以说是一种非常方便的开发方式了 但没有直接性的setup 拿取父组件的参数和函数就会有点问题 其实vue官方给我提供了defineProps和defineEmits这两个方法是官方提供 不需要引入 直接用就好了 例如这里 我们给子组件传了三个参数 :imgSrc“user.images…

scrcpy 快捷键

可以使用键盘和鼠标在 scrcpy 窗口上执行操作 快捷方式。 在下面的列表中&#xff0c;是快捷方式修饰符。默认情况下&#xff0c;它是 &#xff08;左&#xff09;或&#xff08;左&#xff09;。MODAltSuper 可以使用 进行更改。可能的键是 、 、 和 。例如&#xff1a;–sh…

湖南大学OS-2019期末考试解析

【特别注意】 答案来源于wolf以及网络 是我在备考时自己做的&#xff0c;仅供参考&#xff0c;若有不同的地方欢迎讨论。 【试卷评析】 这张卷子有点老了&#xff0c;部分题目可能有用。如果仔细研究应该会有所收获。 【试卷与答案】 一、选择题&#xff08;15%&#xff…

6、JS-AJAX

6.3、AJAX 6.3.1、AJAX概述 传统的web交互是用户触发一个http请求服务器&#xff0c;然后服务器收到之后&#xff0c;在做出响应到用户&#xff0c;并且返回一个新的页面&#xff0c;每当服务器处理客户端提交的请求时&#xff0c;客户都只能空闲等待&#xff0c;并且哪怕只是…

制作一个电商数据可视化大屏无从下手?看这篇!

01 啥叫可视化大屏&#xff1f; 从字面意思就能看出来&#xff0c;可视化大屏就是有个大屏幕。可视化体现在里面的数据都成了图形和图标&#xff0c; 但是静止的图像也不能完全表现出多报表的结果&#xff0c;可视化大屏是将数据通过图形化、可视化的方式展现在大屏幕上的一种…

【深度学习】BERT变种—百度ERNIE 2.0

ERNIE 2.0 提出了一种持续学习的预训练框架&#xff1a;预训练使用了7种任务&#xff0c;而不是一两种简单的任务。不断引入新的预训练任务&#xff0c;让模型可以持续性地学习不同的预训练任务&#xff0c;并且不会遗忘先前学习的知识&#xff0c;以此让模型能够获得更为全面的…

让小白也能看懂,ChatGPT入门级科普“十问十答”

由于现在GPT火热&#xff0c;360老板已经开始总动员. 白领的日常工作肯定是要发生颠覆性变化的。下面我们就通过自问自答的方式带领小白用户了解一下ChatGPT. 1、ChatGPT到底是什么&#xff1f; ChatGPT 是一个由美国人工智能公司 OpenAI 开发的自然语言处理&#xff08;NLP&…

vue Electron ArcGis 桌面应用 Sqllite3 node-grp:老旧项目的起死回生

最近接收了一个三四年前做的项目。主要技术栈就是vue2electronsqllite3node-gyp。看到这个技术栈&#xff0c;基本可以知道感知这个项目的关键词&#xff1a;vue、Gis地图、本地数据库、桌面客户端。顿时深感亚历山大。 不多说&#xff0c;开干。 第一步&#xff0c;查看项目…

Qemu搭建ARM Vexpress开发环境

Qemu搭建ARM Vexpress开发环境 文章目录 Qemu搭建ARM Vexpress开发环境Qemu简介QEMU安装前的准备工作QEMU 安装的两种方式通过网络在线安装源码编译安装源码获取QEMU依赖库安装编译安装 命令选项qemu的标准选项qemu显示选项网络属性相关选项kvm的网络模型 Ubuntu 双网卡&#x…

阿里高级工程师纯手打造的Spring Cloud Alibaba微服务全彩手册,限时分享

Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案&#xff0c;是阿里巴巴开源中间件与 Spring Cloud 体系的融合。 Springcloud 和 Srpingcloud Alibaba 区别&#xff1f; SpringCloud&#xff1a; 部分组件停止维护和更新&#xff0c;给开发带来不便;SpringC…

msvcr120.dll丢失怎样修复,快速修复msvcr120.dll的方法分享

msvcr120.dll是Microsoft Visual C Redistributable for Visual Studio 2013的一个组件&#xff0c;是一个动态链接库文件。它包含了许多函数和程序&#xff0c;可以被其他程序调用&#xff0c;这些程序使用了Visual C 2013运行时库。在Windows操作系统中&#xff0c;许多软件和…

vxe-table 列表过滤踩坑

vxet-table 官网给的案例&#xff1a;https://vxetable.cn/#/table/base/filter 通过设置 filters 属性和 filter-method 方法可以开启列筛选功能&#xff0c;通过 filter-multiplefalse 设置为单选 如果是服务端筛选&#xff0c;只需加上 filter-config{remote: true} 和 fi…

vue页面缓存失效问题解决

文章目录 一、问题背景二、问题排查三、问题解决 一、问题背景 前端技术栈用的是vue&#xff0c;然后用keep-alive组件进行缓存页面【切换页面不进行刷新页面&#xff0c;保留之前的查询条件及状态等等】 测试提bug&#xff1a;部分页面突然缓存失效了&#xff0c;每次切换都…

易基因:全基因组DNA甲基化和小RNA分析揭示甘蓝型油菜种子的基因组不对称性 | 植物发育

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 多倍体是被子植物基因组进化中的一种持续现象&#xff0c;有助于现存开花植物的多样性。甘蓝型油菜&#xff08;Brassica napus&#xff09;是世界上最重要的被子植物油料作物品种之一&a…

2023年系统分析师上午题

全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试 2023年上半年 系统分析师 上午试卷 &#xff08;考试时间 9 : 00&#xff5e;11 : 30 共 150 分钟&#xff09; 1. 在答题卡的指定位置上正确写入你的姓名和准考证号&#xff0c;并用正规 2B 铅笔在你写入…