Bellman-Ford

    date: 2018/2/2
author:pprp
theme:Dijstra

简介

  • 单源最短路问题
  • 要求: 图中不能出现负圈
  • 思路:

    Bellman-Ford算法就是遍历所有的边进行\(n-1\)次更新(每次更新就是对所有的可用节点进行松弛)
  • 对比:Dijkstra算法:重复比较多,对每个都要进行松弛,这事实上是没有必要的,但是也是可以保证结果的准确性

代码实现

  • C++实现
#include <iostream>

using namespace std;
const int MAX_E = 1000;
const int MAX_V = 1000;
const int inf = 0x3f3f3f3f;
struct edge{
int from;
int to;
int cost;
}; edge es[MAX_E];
int d[MAX_V];
int V, E; 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() {
cin >> V >> E;
int x, y, z;
for(int i = 0 ; i < E; i++){
cin >> es[i].from >> es[i].to >> es[i].cost;
}
shortest_path(0);
for(int i = 0 ; i < V; i++){
cout << d[i] << " ";
}
cout << endl;
return 0;
}
clear all;close all;clc
%初始化邻接压缩表
b=[1 2 6;
4 7
3 5;
4 8;
5 -4;
2 -2;
3 -3;
5 9;
1 2;
3 7]; m=max(max(b(:,1:2))); %压缩表中最大值就是邻接矩阵的宽与高
A=compresstable2matrix(b); %从邻接压缩表构造图的矩阵表示
netplot(A,1) %形象表示 S=inf(1,m); %源到其他节点的最短距离,开始为inf
S(1)=0; %源点到自己的距离为0
pa=zeros(1,m); %寻找到的节点的前趋
pa(1)=1; %源点的前趋是自己 pre_pa=ones(1,m);
while sum(pre_pa==pa)~=m %终止条件,判断终止的方法很多,这个应该不是最佳实践
pre_pa=pa;
for k=1:m
if pre_pa(k)~=0 %对每一个已搜寻到的节点,从此节点寻找后继节点
i=k;
for j=1:m
if A(i,j)~=inf
if S(j)>S(i)+A(i,j)
S(j)=S(i)+A(i,j); %边缘松弛,取两节点间最小权值作为实际权值
pa(j)=i; %寻找前趋
end
end
end
end
end
end
%最终我们需要的就是这两个值
S %源点到其他每一点的距离
pa %其他每一节点的前趋 %算法到此结束,下面只是为了形象的表示而写的。
re=[];
for i=2:m
re=[re;pa(i) i A(pa(i),i)];
end
A=compresstable2matrix(re); %从邻接压缩表构造图的矩阵表示
figure;
netplot(A,1) %形象表示
function A=compresstable2matrix(b)
[n ~]=size(b);
m=max(max(b(:,1:2)));
A=inf(m,m); for i=1:n
A(b(i,1),b(i,2))=b(i,3);
end end

Bellman-Ford FORMCM的更多相关文章

  1. ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)

    两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...

  2. poj1860 bellman—ford队列优化 Currency Exchange

    Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 22123   Accepted: 799 ...

  3. uva 558 - Wormholes(Bellman Ford判断负环)

    题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...

  4. Bellman—Ford算法思想

    ---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...

  5. Bellman - Ford 算法解决最短路径问题

    Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...

  6. Dijkstra算法与Bellman - Ford算法示例(源自网上大牛的博客)【图论】

    题意:题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 poj2387 Description Bessie is out in the field and ...

  7. POJ 2240 Arbitrage (Bellman Ford判正环)

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:27167   Accepted: 11440 Descri ...

  8. poj1860 兑换货币(bellman ford判断正环)

    传送门:点击打开链接 题目大意:一个城市有n种货币,m个货币交换点,你有v的钱,每个交换点只能交换两种货币,(A换B或者B换A),每一次交换都有独特的汇率和手续费,问你存不存在一种换法使原来的钱更多. ...

  9. ACM/ICPC 之 Bellman Ford练习题(ZOJ1791(POJ1613))

    这道题稍复杂一些,需要掌握字符串输入的处理+限制了可以行走的时间. ZOJ1791(POJ1613)-Cave Raider //限制行走时间的最短路 //POJ1613-ZOJ1791 //Time ...

  10. poj3259 bellman——ford Wormholes解绝负权问题

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 35103   Accepted: 12805 Descr ...

随机推荐

  1. smp,numa,mpp,umam,olap,dss,oltp,greenplum,presto

    SMP.NUMA.MPP体系结构介绍 从系统架构来看,目前的商用服务器大体可以分为三类,即对称多处理器结构 (SMP : Symmetric Multi-Processor) ,非一致存储访问结构 ( ...

  2. Java实现断点续传

    原理: 断点续传的关键是断点,所以在制定传输协议的时候要设计好,如上图,我自定义了一个交互协议,每次下载请求都会带上下载的起始点,这样就可以支持从断点下载了,其实HTTP里的断点续传也是这个原理,在H ...

  3. Linux命令(基础2)

    1.命令概要介绍: 查看目录内容:ls 切换目录命令:cd 创建与删除目录:touch(创建文件).rm(移除文件与目录).mkdir(创建目录) 拷贝与移动命令:cp(拷贝).mv(移动) 查看文件 ...

  4. Spring-BeanFactory容器

    Spring的BeanFactory容器 这是Spring中最简单地容器,它主要的功能是为依赖注入(DI)提供支持.这个容器接口在org.springframework.beans.factory.B ...

  5. docker+MySQL+读写分离

    一.拉取mysql镜像文件docker pull mysql二.查看镜像docker images三.创建配置文件目录mkdir /data/docker/mysql/{master,slave} - ...

  6. JAVA与ACM

    这两天学了一下JAVA的语法,还没有学习后面的核心地方,突然间觉得JAVA这门语言很棒,我要在接下来的时间系统的学习一下.就这么愉快地决定了. Java对于大数计算这方面的优势很大.最重要的是代码量小 ...

  7. SpringMVC-SimpleDEMO

    本博文主要将如何配置一个简单的SpringMVC的DEMO,由上一讲的SpringMVC工作流程来看,配置一个SpringMVC的步骤是简单而清晰的. 一.引入SpringMVC所需依赖   < ...

  8. flask—信号(blinker)

    Flask框架中的信号基于blinker,主要是让开发者在flask请求过程中定制一些用户行为. 安装blinker pip3 install blinker 1.内置信号 request_start ...

  9. css选择器中间的空格

    div p div标签下 的p标签 (后代) div .a div 的后代类属性有a的 div.a 类属性有a的div标签 div.a1.a2 多类选择器 类包含a1,a2的div标签 div.a1 ...

  10. Bootstrap 中的插件的学习2(导航)

    实例 在导航栏内 下面的实例演示了在导航栏内的下拉菜单的用法: <!DOCTYPE HTML> <html> <head> <link href=" ...