实验五:分枝限界法

实验五:分枝限界法

【实验目的】

应用分枝限界法的算法设计思想求解单源最短路径问题。

【实验内容与要求】

采用分支限界法编程求源点0到终点6的最短路径及其路径长度。

要求完成:⑴算法描述⑵写出程序代码⑶完成调试⑷进行过程与结果分析。

【实验性质】

在完成的过程中注意与回溯算法思想的比较,重点注意两种算法思想各自的特点以及实现方式比较。此实验的性质为综合性实验。

【算法思想及处理过程】

算法思想:

创建一个优先队列,用于存放待扩展的节点,初始时将起始节点加入队列中。

初始化起始节点的距离为0,其他节点的距离为无穷大。

不断从优先队列中取出节点,并将其标记为已扩展。然后遍历该节点的相邻节点,更新其距离和前驱节点。

如果通过扩展节点能够获得更短的距离,则更新该节点的距离和前驱节点。

将更新后的节点加入优先队列中。

重复步骤3,直到优先队列为空。

完成后,可以输出从起始节点到其他节点的最短路径及距离。

处理过程:

输入图的节点个数和边的数量。

创建邻接矩阵表示图,并初始化距离数组和前驱节点数组。

调用ShorestPaths函数,传入起始节点的索引。

在ShorestPaths函数中,创建一个优先队列,首先将起始节点加入优先队列中。

循环执行以下步骤:

从优先队列中取出一个节点。

遍历该节点的相邻节点,更新其距离和前驱节点。

如果更新后的节点不在优先队列中,则将其加入队列中。

输出从起始节点到各节点的最短路径及距离。

【程序代码】

#include <iostream>  

#include<queue>

using namespace std;

#define MAX 99               

struct Node {

    int length; //权值

    int i;  //结点编号

    friend bool operator <(Node a, Node b)

    {

        return a.length > b.length;

    }

};

class Graph

{

public:

    void ShorestPaths(int);

    void ShowDist();

    Graph();

    ~Graph();

private:

    int n;

    int* prev;

    int** c;

    int* dist;

};

Graph::Graph()

{

    int wi = 0;

    int yi = 0;

    int s;

    int i, j, m;

    cout << "请输入图的节点个数:";

    cin >> n;

    cout << "请输入图的边的条数:";

    cin >> s;

    c = new int* [n];

    for (wi = 0; wi < n; wi++)

    {

        c[wi] = new int[n];

    }

    dist = new int[n];

    prev = new int[n];

    for (wi = 0; wi < n; wi++)

    {

        for (yi = 0; yi < n; yi++)

        {

            c[wi][yi] = MAX;

        }

    }

    cout << "请输入图的边( ijc[i,j] ) " << endl;

    for (wi = 1; wi <= s; wi++)

    {

        cin >> i >> j >> m;

        c[i][j] = m;

    }

    for (wi = 0; wi < n; wi++)

    {

        dist[wi] = MAX;

        prev[wi] = 0;

    }

    prev[0] = 0;

}

Graph::~Graph()

{

    for (int i = 0; i < n; i++)

        delete[]c[i];

    delete[]c;

    delete[]dist;

    delete[]prev;

}

void Graph::ShowDist()

{

    cout << endl << "从源点到各节点的最短路径:" << endl;

    int i = 0;

    int temp = 0;

    for (i = 0; i < n; i++)

    {

        cout << "dist[" << i << "] = " << dist[i] << endl;

    }

    cout << "从源点到终点的最短路径长度为:" << dist[n - 1] << endl;

    cout << "其路径为:";

    temp = n - 1;

    while (temp >= 0)

    {

        if (prev[temp] == 0 && temp == 0)

        {

            cout << temp;

            break;

        }

        else

        {

            cout << temp << "->";

        }

        temp = prev[temp];

    }

    cout << endl;

}

void Graph::ShorestPaths(int v)

{

    priority_queue<Node> H;  //定义优先队列(最小堆)     

    Node E;    //扩展节点  

    E.i = v;

    E.length = 0;

    dist[v] = 0;

    cout << "当前扩展节点:" << E.i << ",权重:" << E.length << endl;

    while (true)

    {

        int j;

        for (j = 0; j < n; j++)

        {

            if ((c[E.i][j] != MAX) && (c[E.i][j] != 0))

            {

                if (E.length + c[E.i][j] < dist[j])

                {

                    dist[j] = E.length + c[E.i][j];

                    prev[j] = E.i;

                    if (j != n - 1)

                    {

                        Node N;

                        N.i = j;

                        N.length = dist[j];

                        H.push(N); //N结点入队

                        cout << "入队结点:" << N.i << ",权重:" << N.length << endl;

                    }

                }

            }

        }   //for

        if (!H.empty())

        {

            E = H.top();//出队

            cout << "出队:" << E.i << endl;

            H.pop();  //删除該元素

            cout << endl << "下一个扩展节点:" << E.i << ",权重:" << E.length << endl;

        }

        else

            break;

    }  //while

}

int main()

{

    Graph g;

    g.ShorestPaths(0);

    g.ShowDist();

    return 0;

}

【运行结果】

自行运行截图

【算法分析】

算法分析: Dijkstra算法的时间复杂度为O(n^2),其中n为节点的个数。由于使用了优先队列H来优化算法,堆的插入和删除操作的时间复杂度为O(logn),因此总的时间复杂度为O(nlogn)。

空间复杂度为O(n^2),主要是二维数组c的空间和堆的空间。

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

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

相关文章

logTrick

贴一下灵神的题解里面的解释~ 就是一种优化策略&#xff0c;logtrick class Solution { public:int minimumDifference(vector<int>& nums, int k) {int res 0x3f3f3f3f;int n nums.size();for(int i0;i<n;i){res min(res,abs(nums[i]-k));for(int j i-1;j&g…

编程0基础学难吗:深度剖析与实用指南

编程0基础学难吗&#xff1a;深度剖析与实用指南 编程&#xff0c;这个看似神秘而高深的领域&#xff0c;对于许多零基础的学习者来说&#xff0c;往往伴随着一系列的疑问和困惑。那么&#xff0c;编程零基础学习究竟难不难呢&#xff1f;本文将从四个方面、五个方面、六个方面…

算法题解记录28+++对称二叉树(百日筑基)

一、题目描述&#xff1a; 题目难度&#xff1a;简单 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 分割线 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,nul…

SpringAI学习及搭建AI原生应用

文章目录 一、SpringAI是什么二、准备工作1.GPT-API-free2.AiCore3.eylink 三、对话案例实现1.创建项目2.实现简单的对话 四、聊天客户端ChatClient1.角色预设2.流式响应3.call和stream的区别 五、聊天模型提示词提示词模板 六、图像模型(文生图)七、语音模型1.文字转语音(文生…

【C语言】分支与循环(下)

目录 6. while 循环 7. for 循环 8. do-while 循环 9. break 和 continue 循环 10. 循环的嵌套 11. goto 语句 正文开始—— 6. while 循环 C语言提供了三种循环&#xff0c;while 就是其中一种。 while 语句的语法结构与 if 语句非常相似。 6.1 if 和 wh…

ubuntu中安装docker并换源

使用 Ubuntu 的仓库安装 Docker sudo apt update现在&#xff0c;你可以使用以下命令在 Ubuntu 中安装 Docker 以及 Docker Compose&#xff1a; sudo apt install docker.io docker-composeDocker 包被命名为 docker.io&#xff0c;因为在 Docker 出现之前就已经存在一个名为…

hashlib的简单使用

在 Python 中&#xff0c;hashlib 模块提供了常见的哈希算法&#xff0c;如 SHA1, SHA256, MD5 等。在安全性相关的应用中&#xff0c;比如用户密码存储&#xff0c;hashlib 通常用于生成哈希值以确保密码存储的安全性&#xff0c;因为直接存储用户密码是不安全的。 以下是如何…

【论文复现|智能算法改进】基于多策略融合灰狼算法的移动机器人路径规划

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.改进点 混沌反向学习策略 融合Logistic混沌映射和Tent混沌映射生成Logistic-Tent复合混沌映射: Z i 1 { ( r Z i ( 1 − Z i ) ( 4 −…

git - LFS 使用方法

安装Git LFS 访问 Git LFS官网 下载适用于您操作系统的版本。 Linux用户&#xff0c;解压缩下载的.tar.gz文件&#xff0c;并通过终端运行安装脚本。 tar -xvf git-lfs-linux-amd64-vX.Y.Z.tar.gz cd git-lfs-X.Y.Z sudo ./install.sh 初始化Git LFS # 全局启用 git lfs i…

window11 系统更新失败处理办法

方法一&#xff1a;运行 Windows 更新疑难解答 按 Win I 打开设置。选择“系统”。选择“疑难解答”&#xff0c;然后点击“其他疑难解答”。找到“Windows 更新”&#xff0c;并运行疑难解答。 方法二&#xff1a;使用 DISM 工具修复系统文件 在开始菜单中搜索“命令提示符…

618大促背后的智能力量:天润融通如何用AI大模型提升客户服务?

五一结束之后&#xff0c;消费零售企业马上又要进入一场紧锣密鼓的新战斗——618&#xff0c;一场上半年最重要的促销活动。 对品牌和商家来说&#xff0c;每年618都是一场新考验。因为618时间有限&#xff0c;而消费趋势总是在不断变化&#xff0c;市场竞争又越来越激烈。如何…

LogicFlow 学习笔记——5. LogicFlow 基础 主题 Theme

主题 Theme LogicFlow 提供了设置主题的方法&#xff0c;便于用户统一设置其内部所有元素的样式。设置方式有两种&#xff1a; 初始化LogicFlow时作为配置传入初始化后&#xff0c;调用LogicFlow的 setTheme 方法 主题配置参数见主题API 配置 new LogicFlow 时作为将主题配…

掌握高等数学、线性代数、概率论所需数学知识及标题建议

在数学的广袤领域中&#xff0c;高等数学、线性代数和概率论作为三大核心分支&#xff0c;不仅在理论研究中占据重要地位&#xff0c;更在实际应用中发挥着举足轻重的作用。为了深入理解和掌握这三门学科&#xff0c;我们需要掌握一系列扎实的数学知识。 高等数学所需数学知识 …

Tensorflow-GPU工具包了解和详细安装方法

目录 基础知识信息了解 显卡算力 CUDA兼容 Tensorflow gpu安装 CUDA/cuDNN匹配和下载 查看Conda driver的版本 下载CUDA工具包 查看对应cuDNN版本 下载cuDNN加速库 CUDA/cuDNN安装 CUDA安装方法 cuDNN加速库安装 配置CUDA/cuDNN环境变量 配置环境变量 核验是否安…

算法与数据结构--决策树算法

欢迎来到 Papicatch的博客 文章目录 &#x1f349;决策树算法介绍 &#x1f348;原理 &#x1f348;核心思想包括 &#x1f34d;递归分割 &#x1f34d;选择标准 &#x1f34d;剪枝 &#x1f348;解题过程 &#x1f34d;数据准备 &#x1f34d;选择最佳分割特征 &…

Qt 实战(4)信号与槽 | 4.2、自定义信号与槽

文章目录 一、自定义信号与槽1、自定义信号2、自定义槽3、连接信号与槽4、总结 前言&#xff1a; 在Qt框架中&#xff0c;信号&#xff08;signals&#xff09;和槽&#xff08;slots&#xff09;机制是对象间通信的核心。这种机制允许对象在特定事件发生时发出信号&#xff0c…

【GD32】 TIMER通用定时器学习+PWM输出占空比控制LED

扩展&#xff1a;对PWM波形的输出进行捕获 目录 一、简介二、具体功能描述1、时钟源的选择&#xff1a;2、预分频器&#xff1a;3、计数模式&#xff1a;向上计数模式&#xff1a;向下计数模式&#xff1a;中央对齐模式&#xff1a; 4、捕获/比较通道 输入捕获模式 输出比…

仙侠手游【天道情缘】修复版服务端+GM后台+详细教程

下载地址&#xff1a;仙侠手游【天道情缘】修复版服务端GM后台详细教程

【电子信息工程专业课】学习记录

数字信号处理 离散时间信号与系统 周期延拓 一个连续时间信号经过理想采样后&#xff0c;其频谱将沿着频率轴以采样频率Ωs 2π / T 为间隔而重复。 混频 各周期的延拓分量产生频谱交替的现象 奈奎斯特采样定理 fs > 2fh Z变换 收敛域&#xff1a;使任意给定序列x(n)的Z变…

ROS机器人小车建模仿真与SLAM

文章目录 一、URDF二、创建小车模型1.创建功能包2.导入依赖3.创建urdf,launch文件&#xff1a;4.可视化 三、添加雷达1.xacro文件2.集成和修改launch3.添加摄像头和雷达 三.GAZEBO仿真四、orbslam2kitti1.下载2.安装编译ORB_SLAM23.运行Kitee数据集 一、URDF ​ URDF&#xff…