【算法】Bellman-Ford算法(单源最短路径问题)(判断负圈)
单源最短路问题是固定一个起点,求它到其他所有点的最短路的问题。
算法:
设 d[i] 表示 起点 s 离点 i 的最短距离。
固定起点s,对所有的点 , i = s , d[i] 置为 0 ;i != s , d[i] 置为 INF,执行 2。
update = false。 找边,将可以更新的点和边,更新这个点离源点的距离,update = true。 如果更新过update = true,重复执行2 ; 如果没有更新过update = false, 执行3。
打印 d 数组中所求的结果。
代码:
#include <bits\stdc++.h>
using namespace std;
#define INF 2147483647
#define MAX_V 1000
#define MAX_E 2000 // 单源最短路径1(Bellman-Ford算法) struct edge{int from,to,cost;
};edge es[MAX_E]; //所有的边 int d[MAX_V]; //d[i]表示源点到i点的最短距离
int V,E; //V是顶点数,E是边数 //求解从s离所有点的距离
void shortest_path(int s){for(int i = 0;i < V; i++) d[i] = INF;d[s] = 0;//用可到达的点和从这个点出发的边更新这条边到达的点与源点的距离。//如果无点可更新,则跳出 while(true){bool update = false;for(int i = 0;i < E; i++){edge e = es[i];if(d[e.from] != INF && d[e.to] > d[e.from] + e.cost){d[e.to] = d[e.from] + e.cost;update = true;}} if(!update) break;}
}int main(){
}
负圈:负圈又称负环,就是说一个全部由负权的边组成的环,这样的话不存在最短路,因为每在环中转一圈路径总长就会边小。
Bellman-Ford算法求最短路径不会经过同一个点两次。如果不存在负圈的话最多会更新 V-1 次,即每次只更新出一个点(想象一下线性存储的情况)。
如果有负圈的话会无限更新下去。
所以判断负圈是否存在只用判断是否更新了大于V-1次即可。
代码:
#include <bits\stdc++.h>
using namespace std;
#define INF 2147483647
#define MAX_V 1000
#define MAX_E 2000 // 单源最短路径1(Bellman-Ford算法) struct edge{int from,to,cost;
};edge es[MAX_E]; //所有的边 int d[MAX_V]; //d[i]表示源点到i点的最短距离
int V,E; //V是顶点数,E是边数 //判断是否存在负圈
bool find_negative_loop(){memset(d,0,sizeof(d));for(int i = 1;i <= V; i++){for(int j = 0;j < E; j++){edge e = es[j];if(d[e.to] > d[e.from] + e.cost){d[e.to] = d[e.from] + e.cost;//如果更新了V次说明存在负圈 if(i == V) return true;}}}return false;
}int main(){
}
【算法】Bellman-Ford算法(单源最短路径问题)(判断负圈)相关推荐
- 最短路径问题——Dijkstra算法详解(单源最短路径)
单源最短路径 单源最短路径,是指从图中任一点出发到其他各点之间的最短路径. Dijkstra算法介绍 Dijkstra算法又称迪杰特斯拉算法,dijkstra算法的核心思想是将全部结点所在集合V分成两 ...
- 分支限界法 java_算法java实现–分支限界法–单源最短路径问题 | 学步园
单源最短路径问题的java实现(分支限界法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/details/8900872 ...
- 最短路径——迪杰斯坷垃算法(有向图、单源最短路径)
最短路径的算法有两种:迪杰斯坷垃算法和弗洛伊德算法. 但是两种算法各有优劣: 迪杰斯坷垃算法适合单源点最短路径的获取, 弗洛伊德算法适合各点间最短路径的获取,即多源点最短路径的获取: 今天主要讲解迪杰 ...
- SPFA or bellman ford松弛法--单源最短路
问题概述:有编号1-n的n个站点,有m条公交车路线,公交车只从一个起点站直接到达终点站,是单向的且每条路线有它自己的车费,有P个人早上从1出发,他们要到达每一个公交站点,然后到了晚上再返回点1,求所有 ...
- Bellman-Ford 单源最短路径算法
Bellman-Ford 单源最短路径算法 Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 R ...
- 单源最短路径dijkstra算法
介绍 dijkstra算法也是解决单源最短路径问题的一种方法.它要求图中路径都是非负的.而且,它的效率要高于bellman算法. 实现 首先定义图的结点信息和边信息. struct _Node;typ ...
- 单源最短路径的迪克斯特拉(Dijkstra)算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点(节点需为源点)到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展 ...
- 单源顶点最短路径java_单源最短路径-Dijkstra 算法
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问题:求a点到各个点的最短距离,如下图 ...
- 单源路径分支界限java_java单源最短路径算法
. .. .. . 单源最短路径的 Dijkstra 算法: 问题描述: 给定一... 并 应用贪心法求解单源最短路径问题.环境要求对于环境没有特别要求.对于算法实现,可以自由选择 C, C++, J ...
- 单源最短路径问题-迪杰斯特拉算法(Dijsktra)
一.问题描述: 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数.再给定 V 中的一个顶点,称为源,计算源到所有顶点的最短距离. 实例:单源最短路径(弱化版)https://www. ...
最新文章
- Swift中的问号?和感叹号!
- 解决Visual Code安装中文插件失败问题
- offsetLeft 、offsetWidth、scrollHeight等的区别
- python创建一个类初始化两个变量name、age_Python小白入门:第八讲||类
- 华为云网络覆盖全球2500+站点,打造高品质、低成本接入体验
- IOS开发之小实例--UIImagePickerController
- 华章7-8月份新书简介(2015年)
- 关于为什么我推荐大家看vue代码的随想
- qt 窗口自绘、鼠标响应拖动窗口
- 洛谷——P1568 赛跑
- Jenkins在Windows下的安装与配置
- 显示计算机硬盘驱动器更改,Win10专业版识别不了第二个硬盘驱动器的处理方法...
- 西威驱动板PV33-4 电源驱动板图纸 37千瓦左右基本一样 文件发送非实物
- 数学笔记——导数4(反函数的导数)
- cad卸载不干净_Mac软件卸载不干净?你可以试试AppCleaner
- gopup是疫情经济生活搜索指数数据接口
- 农业物联网系统功能特点
- python网络爬虫笔记
- [经验教程]iPhone苹果手机电池健康度怎么查询及如何更换苹果iPhone手机电池恢复健康度到100%?
- poj-2115 C Looooops 扩展欧几里德算法求最小非负整数解
热门文章
- Java黑皮书课后题第5章:*5.15(显示ASCII码字符表)编写一个程序,打印ASCII字符表从‘!‘到‘~‘的字符。每行打印10个字符。ASCII码表如附录B所示。数字之间用一个空格字符隔开
- shell判断IP地址是否合法
- MVP+WCF+三层结构搭建项目框架(上)
- zabbix如何选择适合的监控类型(107)
- HTMl5的sessionStorage和localStorage
- Windows Message Queue(优先队列)
- modules runAllManagedModulesForAllRequests=true /(转1)
- Ubuntu上的samba共享文件安装配置
- [Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子
- 使用python发送邮件和接收邮件