IGraph使用实例——贝尔曼-福特算法(求解单源最短路径)

1 概述

本文中求解最短路径使用的方法是igraph中基于贝尔曼-福特算法(Bellman-Ford算法)。Bellman-Ford算法是一种用于在加权图中找到从单个源点到所有其他顶点的最短路径的算法。这个算法可以处理包含负权重边的图,但不能处理有负权重循环的图,因为负权重循环会导致最短路径不存在。

2 运行环境

操作系统:win10 64位

编程语言:C/C++

编译平台:vs2019  x64 debug | release

igraph版本: 0.10.12

3 示例代码

 在igraph中igraph_distances_bellman_ford 函数被用来执行Bellman-Ford算法。以下是函数的说明:

igraph_distances_bellman_ford(&g, &res, igraph_vss_all(), igraph_vss_all(), &weights, IGRAPH_OUT);

函数参数说明:

  • &g 是指向图的指针。
  • &res 是指向矩阵的指针,该矩阵将存储从每个顶点到其他所有顶点的最短路径长度。
  • igraph_vss_all() 表示源点和目标点都是图中的所有顶点。
  • &weights 是指向存储边权重的向量的指针。
  • IGRAPH_OUT 表示算法将基于图的出边来计算最短路径。

Bellman-Ford算法的工作原理是通过迭代松弛边来逐步更新从源点到其他顶点的最短路径估计。这个过程重复进行,直到没有更多的边可以松弛,或者检测到负权重循环为止。在代码中,对于包含负权重的图,算法将正常执行并给出最短路径;而对于包含负权重循环的图,算法将返回错误代码 IGRAPH_ENEGLOOP

这段代码是一个C语言程序,它使用了IGraph库来计算图中的最短路径。程序分为三个部分,分别处理了三种不同情况的图:只有正权重的图、含有负权重的图以及含有负权重循环的图。下面是对代码的逐行解释。

// 包含IGraph库的头文件
#include <igraph.h>int main(void) {// 声明一个图变量gigraph_t g;// 声明一个向量weights,用于存储边的权重igraph_vector_t weights;// 定义一组权重数据,用于正权重图igraph_real_t weights_data_0[] = { 0, 2, 1, 0, 5, 2, 1, 1, 0, 2, 2, 8, 1, 1, 3, 1, 1, 4, 2, 1 };// 定义另一组权重数据,用于含有负权重的图igraph_real_t weights_data_1[] = { 6, 7, 8, -4, -2, -3, 9, 2, 7 };// 定义第三组权重数据,用于含有负权重循环的图igraph_real_t weights_data_2[] = { 6, 7, 2, -4, -2, -3, 9, 2, 7 };igraph_matrix_t res;/* Graph with only positive weights */// 创建一个有10个顶点的有向图,添加边和对应的权重,-1表示边的列表结igraph_small(&g, 10, IGRAPH_DIRECTED,0, 1, 0, 2, 0, 3,    1, 2, 1, 4, 1, 5,2, 3, 2, 6,         3, 2, 3, 6,4, 5, 4, 7,         5, 6, 5, 8, 5, 9,7, 5, 7, 8,         8, 9,5, 2,2, 1,-1);// 创建一个视图,将weights_data_0数组作为weights向量的底层数据igraph_vector_view(&weights, weights_data_0,sizeof(weights_data_0) / sizeof(weights_data_0[0]));// 计算数组元素个数igraph_matrix_init(&res, 0, 0);// 计算从所有顶点到所有其他顶点的最短路径(使用Bellman-Ford算法,权重向量为weights,按出边)igraph_distances_bellman_ford(&g, &res, igraph_vss_all(), igraph_vss_all(),&weights, IGRAPH_OUT);// 打印矩阵res中的结果igraph_matrix_print(&res);// 销毁矩阵resigraph_matrix_destroy(&res);// 销毁图gigraph_destroy(&g);printf("\n");/***************************************//* Graph with negative weights */// 创建一个有5个顶点的有向图,并添加边和对应的权重igraph_small(&g, 5, IGRAPH_DIRECTED,0, 1, 0, 3, 1, 3, 1, 4, 2, 1, 3, 2, 3, 4, 4, 0, 4, 2, -1);// 使用weights_data_1数组作为权重igraph_vector_view(&weights, weights_data_1,sizeof(weights_data_1) / sizeof(weights_data_1[0]));// 重新初始化矩阵resigraph_matrix_init(&res, 0, 0);// 计算从所有顶点到所有其他顶点的最短路径igraph_distances_bellman_ford(&g, &res, igraph_vss_all(),igraph_vss_all(), &weights, IGRAPH_OUT);// 打印矩阵res中的结果igraph_matrix_print(&res);/***************************************//* Same graph with negative loop */// 设置错误处理函数,忽略错误igraph_set_error_handler(igraph_error_handler_ignore);// 使用weights_data_2数组作为权重igraph_vector_view(&weights, weights_data_2,sizeof(weights_data_2) / sizeof(weights_data_2[0]));// 尝试计算最短路径,检查是否有负权重循环if (igraph_distances_bellman_ford(&g, &res, igraph_vss_all(),igraph_vss_all(),&weights, IGRAPH_OUT) != IGRAPH_ENEGLOOP) {// 如果没有检测到负权重循环,返回错误代码1return 1;}// 销毁矩阵resigraph_matrix_destroy(&res);// 销毁图gigraph_destroy(&g);// 检查是否有未完成的操作if (!IGRAPH_FINALLY_STACK_EMPTY) {// 如果有,返回错误代码1return 1;}// 正常退出,返回0return 0;
}

4 运行结果

根据提供的运行结果,我们可以看到两部分输出:

  1. 第一部分是一个矩阵,它表示的是第一个图中从每个顶点到其他所有顶点的最短路径长度。在这个矩阵中,"Inf" 表示无穷大,即不存在路径或者路径长度为无穷大。矩阵中的数字表示从行顶点到列顶点的最短路径长度。

  2. 第二部分是第二个图的邻接矩阵表示,其中正值表示正权重的边,负值表示负权重的边。

现在,让我们分析第一部分的输出:

这个矩阵显示了从每个顶点到其他顶点的最短路径长度。例如,从顶点0到顶点1的最短路径长度是0(因为它们是同一个顶点),从顶点0到顶点4的最短路径长度是5。如果某个值是"Inf",这意味着从该行的顶点到该列的顶点没有路径。

第二部分的输出是一个邻接矩阵,它表示第二个图的边和权重:

在这个邻接矩阵中,矩阵的行和列代表图的顶点,矩阵中的值代表顶点之间的边的权重。例如,从顶点0到顶点2的边的权重是4,从顶点1到顶点3的边的权重是2。负值表示边的权重是负数。

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

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

相关文章

Java集合基础知识点系统性总结篇

目录 集合一、图解集合的继承体系&#xff1f;&#xff08;[图片来源](https://www.cnblogs.com/mrhgw/p/9728065.html)&#xff09;点击查看大图二、List,Set,Map三者的区别&#xff1f;三、List接口的实现3.1、Arraylist 、 LinkedList、Vector3.2、Arraylist 、 LinkedList、…

护网不仅要有好技术、更要有个好身体

护网医疗急救包 吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 2024年的护网已经很接近了&#x…

5月更新!优维EasyOps®平台7大新功能上线~

5月&#xff0c;优维EasyOps全平台产品能力又升级啦&#xff01;&#x1f44f; 快来看看都有新增的功能与优化吧&#xff01;&#x1f447; 重点升级 架构可观测 1.系统监控态势感知 过去&#xff0c;用户在使用监控平台的过程中&#xff0c;存在如下问题&#xff1a; 告警…

Samtec技术前沿 | 全新224G互连产品系列现场演示

【摘要/前言】 数据中心、人工智能、机器学习和量子计算等领域的行业进步推动了新兴系统需求的增长。Samtec 224 Gbps PAM4 互连系统经过精心设计&#xff0c;能够满足这些高性能要求&#xff0c;您将在视频中看到这一点。 【Demo演示】 Samtec 系统架构师Ralph Page讲述了可…

成人本科毕业论文怎么写?分享自己的经验

撰写成人本科毕业论文是一个系统而深入的过程&#xff0c;以下是我个人的经验分享&#xff0c;希望能帮助你更好地完成这一任务&#xff1a; 1. 明确论文选题 兴趣与专长&#xff1a;选择自己感兴趣且有一定专长的领域&#xff0c;这样更容易深入研究。可行性&#xff1a;确保…

Prometheus + Grafana + Alertmanager 系统监控

PrometheusGrafana 系统监控 1. 简介1.1 Prometheus 普罗 米修斯1.2 Grafana 2. 快速试用2.1 Prometheus 普罗 米修斯2.2 Prometheus 配置文件2.3 Grafana 2. 使用 Docker-Compose脚本部署监控服务3. Grafana 配置3.1 配置数据源 Prometheus3.2 使用模板ID 配置监控模板3.3 使用…

java17 新特性(实用)

前言&#x1f440;~ 在更新下一章数据库相关知识前&#xff0c;先分享一下java17的一些新特性&#xff0c;有些新特性狠实用&#xff01;&#xff01;&#xff01; 如果各位对文章的内容感兴趣的话&#xff0c;请点点小赞&#xff0c;关注一手不迷路&#xff0c;如果内容有什么…

计算机组成体系

目录 冯诺依曼体系结构 运算器 存储器 控制器 输入设备 输出设备 CPU 体系特点 实例分析 总结 操作系统 什么是操作系统 理解操作系统的管理特性 什么是管理 驱动层 管理方式 操作系统接口即系统调用接口 用户操作接口 总结 冯诺依曼体系结构 冯诺依曼体系结构…

外星人Alienware X15R1 原厂Windows10系统 oem系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

Overleaf(Latex)论文里插入高清matlab图像,亲测有效!!

如何在论文里插入高清的实验结果是个令人头疼的问题&#xff0c;这里以overleaf对matlab结果为例进行了测试&#xff0c;亲测有效。 在matlab图像结果的左上角选择"文件"->“导出设置” 选择“渲染”&#xff0c;分辨率调至600&#xff1b; 字体和线条粗细视个人…

【Pytorch 】Dataset 和Dataloader制作数据集

文章目录 Dataset 和 Dataloader定义Dataset定义Dataloader综合案例1 导入两个列表到Dataset综合案例2 导入 excel 到Dataset综合案例3 导入图片到Dataset导入官方数据集Dataset 和 Dataloader Dataset指定了数据集包含了什么,可以是自定义数据集,也可以是以及官方数据集Data…

【Cityengine】Cityengine生产带纹理的建筑模型导入UE4/UE5(下)

【Cityengine】Cityengine生产带纹理的建筑模型导入UE4/UE5&#xff08;下&#xff09; 一、导出数据&#xff08;2022中文版案例&#xff09;二、安装datasmith插件三、导入数据四、检查导入材质是否正常五、编辑替换材质六、安装模型编辑插件七、编辑替换建筑规则 一、导出数…

MATLAB和物联网连载1:Internet of Things离你有多远?5行MATLAB的距离

MATLAB和物联网连载1:Internet of Things离你有多远?5行MATLAB的距离 原文&#xff1a;MATLAB和物联网连载1:Internet of Things离你有多远?5行MATLAB的距离 - 知乎 (zhihu.com) 来自俄罗斯的实习生在工作之余喜欢上网看点有的没的。有一天他突然发现了一个神奇的网站叫 T…

servlet小项目与servlet续集

文章目录 servlet小项目与servlet续集,是结合上一次的案例进行升级,给项目新增了,增加员工,删除员工,查询具体员工 功能新增操作修改操作删除操作过滤器Cookie servlet小项目与servlet续集,是结合上一次的案例进行升级,给项目新增了,增加员工,删除员工,查询具体员工 功能 上一…

命名空间,缺省参数和函数重载

前言&#xff1a;本文章主要介绍一些C中的小语法。 目录 命名空间 namespace的使用 访问全局变量 namespace可以嵌套 不同文件中定义的同名的命名空间可以合并进一个命名空间&#xff0c;并且其中不可以有同名的变量 C中的输入和输出 缺省参数&#xff08;默认参数&#…

带大家做一个,易上手的家常猪肉炖白菜

今天 带大家做一个 猪肉炖白菜 一块猪肉 切片 一块生姜 两边

doris实战处理(一)doris表的建表规范、查询

感谢原文&#xff1a;https://mp.weixin.qq.com/s/tGbdkF62WU6qbAH0mqtXuA 第一部分&#xff1a;字符集规范 【强制】数据库字符集指定utf-8&#xff0c;并且只支持utf-8。 命令规范 【建议】库名统一使用小写方式&#xff0c;中间用下划线&#xff08;_&#xff09;分割&a…

外星人Alienware x17R1 原厂Windows11系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

ProxySQL + MySQL MGR 实现读写分离实战

文章目录 前言1、ProxySQL 介绍1.1、ProxySQL 如何工作1.2、ProxySQL 工作原理 2、ProxySQL 安装与读写分离实战2.1、ProxySQL 安装2.2、读写分离配置2.3、读写分离实战2.4、SpringBoot 整合 前言 该文章实践之前&#xff0c;需要搭建MySQL MGR集群&#xff0c;关于 MySQL MGR…

太速科技-基于XC7V690T的12路光纤PCIe接口卡

基于XC7V690T的12路光纤PCIe接口卡 一、板卡概述 基于XC7V690T的12路光纤PCI-E接口卡&#xff0c;用于实现多通道高速光纤数据接收和发送&#xff0c;板卡兼容PCIe 2.0和PCIe 3.0规范&#xff0c;利用PCI-E Switch PEX 8748实现FPGA芯片与计算机的通信&#xff0c;计算机与板…