求最短路径之BF算法

介绍

全称Bellman-Ford算法,目的是求解有负权边的最短路径问题。
考虑环,根据环中边的边权之和的正负,将环分为零环、正环、负环。其中零环、正环不会影响最短路径的求解,而负环会影响最短路径的求解。
可用BF算法返回一个bool值来判断是否有负环,如果有返回false,否则返回true.

bool BF(int b){
    fill(path,path+maxn,INF);
    path[b]=0;
    //求最短距离
    for(int i=0;i<n-1;i++){//比较趟数
        for(int j=0;j<n;j++){//遍历每一个顶点相关的邻接边
            for(int k=0;k<table[j].size();k++){
                int v=table[j][k].v;
                int value=table[j][k].value;
                if(path[j]+value<path[v]){
                    //此时path[v]应该是最小距离
                    path[v]=path[j]+value;
                }
            }
        }
        //判断是否有负环:有返回false,无返回true
        for(int m=0;m<n;m++){//再次遍历边时
            for(int k=0;k<table[m].size();k++){
                int v=table[m][k].v;
                int value=table[m][k].value;
                if(path[m]+value<path[v])
                //还能找到有比path[v]更小的距离
                return false;//说明有负环存在
            }
        }
        return true;//否则无负环
    }
}

设计思想

将求最短路径看作是求以源点为根结点的一棵最短路径树,此时图与起点均确定,因此最短路径树也就确定了,且最短路径树的层数一定不超过顶点个数V,即树中两顶点的比较更新次数不超过V-1轮。

实现

由于用邻接矩阵遍历边时,复杂度会达到O(V的3次方),因此我们使用邻接表去实现

应用

由于求最短路径条数时,BF算法会重复遍历相同的顶点,因此在有多条最短路径数时,最短路径条数的累加会出错。于是我们想到用set容器记录前驱结点,通过遍历去重后的前驱结点进行累加。
set容器的介绍
在这里插入图片描述

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
const int maxn=100;
const int INF=1000000000;
struct node{
    int v;//邻接顶点
    int value;//对应边权
    //通过构造函数实现定义同时初始化
    node(int a,int b):v(a),value(b){}
};
vector<node> table[maxn];
int n,edge,st,ed,weight[maxn];

int path[maxn],num[maxn],w[maxn];
set<int> pre[maxn];//记录前驱,以便去重

void BF(int b){
     fill(path,path+maxn,INF);
     memset(num,0,sizeof(num));
     memset(w,0,sizeof(w));
     path[b]=0;
     w[b]=weight[b];
     num[b]=1;
     for(int i=0;i<n-1;i++){
         for(int j=0;j<n;j++){
             for(int k=0;k<table[j].size();k++){
                 //记录
                 int v=table[j][k].v;
                 int value=table[j][k].value;
                 if(path[j]+value<path[v]){
                     path[v]=path[j]+value;
                     w[v]=w[j]+weight[v];
                     num[v]=num[j];//小于覆盖
                     pre[v].clear();//清空
                     pre[v].insert(j);//记录最短路径前驱
                 }else if(path[j]+value==path[v]){
                     if(w[v]<w[j]+weight[v])
                     w[v]=w[j]+weight[v];
                     pre[v].insert(j);//继续记录
                     num[v]=0;//防止重复计数,清空
                     //重新累加计数:通过遍历前驱结点实现
                     for( set<int>::iterator it=pre[v].begin();it!=pre[v].end();it++)
                     num[v]+=num[*it];//*it=pre[j][k],即k的前驱
                 }
             }
         }
     }
 }

int main(){
    int v1,v2,weigh;
    cin>>n>>edge>>st>>ed;
    for(int i=0;i<n;i++)
    cin>>weight[i];
    for(int j=0;j<edge;j++){//构建邻接表
        cin>>v1>>v2>>weigh;
        table[v2].push_back(node(v1,weigh));
        table[v1].push_back(node(v2,weigh));
    }
    BF(st);
    cout<<num[ed]<<" "<<w[ed]<<endl;
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis之十:Spring Data Redis --- CrudRepository方式

SpringData Redis CrudRepository方式 Spring Data Redis 的 CrudRepository 是 Spring Data 框架中用于提供基础 CRUD&#xff08;创建、读取、更新和删除&#xff09;操作的一个接口。在与 Redis 集成时&#xff0c;尽管 Redis 是一个键值存储系统&#xff0c;并没有像关系型…

【达梦数据库】如何使用idea antrl4插件方式dm sql

使用idea中的antrl插件进行分析 1.打开IDEA&#xff0c;在File—Settings—Plugins中&#xff0c;安装ANTLR v4 grammar plugin插件。 2.加载达梦的语法文件 3.配置生成路径和目录&#xff08;可采用默认&#xff09; 4.编译DmSqlParser.g4 DmSqlLexer.g4 5.输入SQL/输入文件 …

用Flutter开发App:助力您的移动业务腾飞

一、Flutter简介 Flutter是Google推出的用于构建多平台应用程序的开源UI框架。它使用Dart语言编写&#xff0c;可以编译为原生机器代码&#xff0c;从而提供卓越的性能和流畅的用户体验。 二、Flutter的优势 一套代码&#xff0c;多平台部署&#xff1a;Flutter可以使用一套代…

electron安装最后一部卡住了?

控制台如下错误 不是的话基本可以划走了 这个很可能是镜像出现问题了&#xff0c;不一定是npm镜像 打开npm的配置文件添加下述 electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ electron_builder_binaries_mirrorhttps://npmmirror.com/mirrors/electron-build…

将本地的镜像上传到私有仓库

使用register镜像创建私有仓库 [rootopenEuler-node1 ~]# docker run --restartalways -d -p 5000:5000 -v /opt/data/regostry:/var/lib/registry registry:2[rootopenEuler-node1 ~]# docker images REPOSITORY TAG IMAGE…

JAVAEE初阶 JVM(二)

垃圾回收和双亲委派模型 1.双亲委派模型2.垃圾回收机制(1) 识别垃圾1.引用计数2.可达性分析 (2) 销毁垃圾1.标记清除2.复制算法3.标记整理 3.分代回收 1.双亲委派模型 描述了如何查找.class文件的策略. 同时JVM中有专门进行类加载的操作,有一个模块,叫做类加载器. 上述就是为了…

Linux(CentOS为例)环境下 Git提交代码加速,使用FastGithub,运行报错解决

当你的在服务器上使用Git进行推送时&#xff0c;时常会出现超时错误。这里使用FastGithub 首先下载FastGithub 这个软件作者不是为什么删除了GithUb的仓库&#xff0c;这个链接还有。下载Linux版本的 FastGithub Linux&#xff0c;Windows版本 下载完毕后解压 ./fastgithu…

Stable Diffusion WebUI API http://127.0.0.1:7860/docs空白

在尝试调用Stable Diffusion WebUI API的时候&#xff0c;打开http://127.0.0.1:7860/docs遇到了以下页面 网络诊断是这样的原因&#xff1a; 修bug&#xff0c;改来改去遇到了以下两种页面&#xff1a; 此时http://127.0.0.1:7860可以如下正常显示&#xff1a; 查资料的时候找…

重学SpringBoot3-@EnableConfigurationProperties注解

重学SpringBoot3-EnableConfigurationProperties注解 1. 引言2. EnableConfigurationProperties 的作用3. 使用示例4. 总结 1. 引言 Spring Boot 提供了一种便捷的方式来管理和校验应用程序的配置&#xff0c;即通过类型安全的配置属性。EnableConfigurationProperties 注解在…

【详识JAVA语言】数组的定义与使用

数组的基本概念 为什么要使用数组 假设现在要存5个学生的javaSE考试成绩&#xff0c;并对其进行输出&#xff0c;按照之前掌握的知识点&#xff0c;我么会写出如下代码&#xff1a; public class TestStudent{public static void main(String[] args){int score1 70;int sc…

【AI绘画】免费GPU Tesla A100 32G算力部署Stable Diffusion

免责声明 在阅读和实践本文提供的内容之前&#xff0c;请注意以下免责声明&#xff1a; 侵权问题: 本文提供的信息仅供学习参考&#xff0c;不用做任何商业用途&#xff0c;如造成侵权&#xff0c;请私信我&#xff0c;我会立即删除&#xff0c;作者不对读者因使用本文所述方法…

简单的shell 脚本练习

编写函数&#xff0c;实现打印绿色OK和红色FAILED&#xff0c;判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED &#xff08;1&#xff09;编写脚本 &#xff08;2&#xff09;更改权限测试 编写函数&#xff0c;实现判断是否无位置参数&#xff0c;如无参数&a…

wordpress外贸独立站

WordPress外贸电商主题 简洁实用的wordpress外贸电商主题&#xff0c;适合做外贸跨境的电商公司官网使用。 https://www.jianzhanpress.com/?p5025 华强北面3C数码WordPress外贸模板 电脑周边、3C数码产品行业的官方网站使用&#xff0c;用WordPress外贸模板快速搭建外贸网…

【机器学习】实验5,AAAI 会议论文聚类分析

本次实验以AAAI 2014会议论文数据为基础&#xff0c;要求实现或调用无监督聚类算法&#xff0c;了解聚类方法。 任务介绍 每年国际上召开的大大小小学术会议不计其数&#xff0c;发表了非常多的论文。在计算机领域的一些大型学术会议上&#xff0c;一次就可以发表涉及各个方向…

RK3568笔记十八:MobileNetv2部署测试

若该文为原创文章&#xff0c;转载请注明原文出处。 记录MobileNetv2训练测试 一、环境 1、平台&#xff1a;rk3568 2、开发板: ATK-RK3568正点原子板子 3、环境&#xff1a;buildroot 4、虚拟机&#xff1a;正点原子提供的ubuntu 20 二、MobileNetv2简介 MobileNet &…

前端面试练习24.3.2-3.3

HTMLCSS部分 一.说一说HTML的语义化 在我看来&#xff0c;它的语义化其实是为了便于机器来看的&#xff0c;当然&#xff0c;程序员在使用语义化标签时也可以使得代码更加易读&#xff0c;对于用户来说&#xff0c;这样有利于构建良好的网页结构&#xff0c;可以在优化用户体…

Python【初识】

一、Python简介 Python是一种高级的解释型编程语言&#xff0c;以其简洁、易学和强大的库支持而闻名。它最初由荷兰国家数学与计算机科学研究中心的吉多范罗苏姆于1990年代初设计&#xff0c;作为一门叫做ABC语言的替代品。Python的设计理念强调优雅、明确和简单&#xff0c;旨…

Google 地图 API 教程--干货(1/2)

Google Maps API 教程 在本教程中我们将学习如何使用谷歌地图API V3创建交互式地图。 什么是 API? API = 应用程序编程接口(Application programming interface)。 API(Application Programming Interface,应用编程接口)其实就是操作系统留给应用程序的一个调用接口,…

vb.net获取Windows主题颜色、深色模式窗体,实时响应

先上效果图 可直接跳到完整代码 目录 先上效果图 开始教学 响应用户的更改 API讲解 读取深浅模式、主题颜色、十六进制颜色转换 完整代码 如果大家留意资源管理器的“文件”菜单的话就会发现它的底色就是你设置的主题色&#xff0c;在更改Windows颜色模式时&#xff0c;…

《OpenScene: 3D Scene Understanding with Open Vocabularies》阅读笔记1

传统的3D场景理解方法依赖于带标签的3D数据集,用于训练一个模型以进行单一任务的监督学习。我们提出了OpenScene,一种替代方法,其中模型在CLIP特征空间中预测与文本和图像像素共同嵌入的3D场景点的密集特征。这种零样本方法实现了与任务无关的训练和开放词汇查询。例如,为了…