Bellman-Ford FORMCM
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的更多相关文章
- ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)
两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...
- poj1860 bellman—ford队列优化 Currency Exchange
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22123 Accepted: 799 ...
- uva 558 - Wormholes(Bellman Ford判断负环)
题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...
- Bellman—Ford算法思想
---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...
- Bellman - Ford 算法解决最短路径问题
Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...
- Dijkstra算法与Bellman - Ford算法示例(源自网上大牛的博客)【图论】
题意:题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 poj2387 Description Bessie is out in the field and ...
- POJ 2240 Arbitrage (Bellman Ford判正环)
Arbitrage Time Limit: 1000MS Memory Limit: 65536K Total Submissions:27167 Accepted: 11440 Descri ...
- poj1860 兑换货币(bellman ford判断正环)
传送门:点击打开链接 题目大意:一个城市有n种货币,m个货币交换点,你有v的钱,每个交换点只能交换两种货币,(A换B或者B换A),每一次交换都有独特的汇率和手续费,问你存不存在一种换法使原来的钱更多. ...
- ACM/ICPC 之 Bellman Ford练习题(ZOJ1791(POJ1613))
这道题稍复杂一些,需要掌握字符串输入的处理+限制了可以行走的时间. ZOJ1791(POJ1613)-Cave Raider //限制行走时间的最短路 //POJ1613-ZOJ1791 //Time ...
- poj3259 bellman——ford Wormholes解绝负权问题
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 35103 Accepted: 12805 Descr ...
随机推荐
- JUnit4.12 源码分析之Statement
1. Statement 抽象类Statement作为命令模式的Command,只有一个方法 各种Runner作为命令模式中的Invoker,将发出各种Statement,来表示它们运行JUnit测试 ...
- JXL导出Excel工具类
将Excel中的数据读取到List<Map<String, Object>>集合中 package com.mvc.util; import java.io.File; ...
- git子模块submodule
添加submodule: git submodule add 子模块git地址 把这个module放置的文件夹(这个文件夹须事先不存在) git submodule add http://xxx.x ...
- (4.20)SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧
转自:指尖流淌 https://www.cnblogs.com/zhijianliutang/p/4085546.html SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧 ...
- Cloudflare发布全球最快的DNS
宣布1.1.1.1:速度最快,隐私优先的消费者DNS服务 Cloudflare的使命是帮助建立更好的互联网.今天我们很高兴能够在推出1.1.1.1--互联网最快,首先保护隐私的消费者DNS服务的同 ...
- python 中元祖tuple的使用
Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. eg, tup1 = (1, 2, 3 ...
- docker——三大核心概念
镜像.容器.仓库是docker的三大核心概念. docker镜像类似于虚拟机镜像,你可以将其理解为一个只读模板. docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用.容器是从 ...
- knockout 学习使用笔记----绑定map--双向绑定
简单的方式,使用 knockout.mapping.js. 1.引入knockout.mapping.js. 2.声明模型 var model = { task:null, feedbacks:[], ...
- Linux-chmod_命令的详细用法讲解
Linux chmod 命令 chmod用于改变文件或目录的访问权限.用户用它控制文件或目录的访问权限.该命令有两种用法.一种是包含 字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. 1 ...
- yii2使用 db log
在本地测试的时候,输出log,还是输出到db中比较顺手. 配置过程: 1.加入log组件的配置: 'log' =>[ # 追踪级别 # 消息跟踪级别 # 在开发的时候,通常希望看到每个日志消息来 ...