最短路径问题——bellman算法
关于最短路径问题,最近学了四种方法——bellman算法、邻接表法、dijkstra算法和floyd-warshall算法。
这当中最简单的为bellman算法,通过定义一个边的结构体,存储边的起点、终点和路径长度,然后通过一个while(1)死循环不断地访问每一条边,更新源点到各点的最短距离,直到没有更新时结束。这时便得到了从源点到其他点的最短距离。附上代码一段:
#include<iostream>
#define INF 100000000
using namespace std;
struct eg
{
int s,t;
int c;
};//边的结构体,存储元素为起点s,终点t,路径s到t之间的长度
eg Eg[100];
int dis[100];
void bellman(int s,int E)
{
fill(dis,dis+100,INF);//初始化所有最短距离为INF;
dis[s]=0;//但源点的最短距离为0,自己到自己
while(1)
{
bool update= false;
for(int i=0;i<E;i++)
{
eg e=Eg[i];
if(dis[e.s]!=INF && dis[e.t]>dis[e.s]+e.c)//更新
{
dis[e.t]=dis[e.s]+e.c;
update = true;
}
}
if(!update)//如果遍历所有的边均不再有更新,则跳出循环
break;
}
}
int main()
{
int E;//定义边的变量
cin >> E;
for(int i=0;i<E;i++)//直接存储边
{
cin >> Eg[i].s >> Eg[i].t >> Eg[i].c;
}
int s1;
cin >> s1;//定义一个源点
bellman(s1,E);
int t;
cin >> t;
cout << dis[t] << endl;
return 0;
}
综上代码我们可以分析,bellman算法的时间复杂度为o(v*e),while循环最多执行v-1次;bellman算法还存在一个问题在于负圈,如果图中存在源点s可达的负圈(图中存在的环并且这个环里面有负边(边的值为负值)),当while循环更新时,走到这个负圈,dis【e.t】>dis[e.s]+e.c则是恒成立,每次的while循环中都会有更新,这样再用刚刚的那个方法的话就会形成死循环,所以,用bellman算法得保证图中不存在源点s可达的负圈。附上查找负圈的代码:
bool find_negative_loop()
{
memset(dis,0,sizeof(dis));//注意和fill的写法不同(fill(dis,dis+e,INF))
for(int i=1;i<=v;i++)
for(int j=0;j<e;j++)
{
eg e=Eg[j];
if(dis[e.t]>dis[e.s]+e.c)
{
dis[e.t]=dis[e.s]+e.c;
if(i==v) return true;
}
}
}
最短路径问题——bellman算法的更多相关文章
- 数据结构与算法--最短路径之Bellman算法、SPFA算法
数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点 ...
- 最短路径问题——floyd算法
floyd算法和之前讲的bellman算法.dijkstra算法最大的不同在于它所处理的终于不再是单源问题了,floyd可以解决任何点到点之间的最短路径问题,个人觉得floyd是最简单最好用的一种算法 ...
- 最短路径问题——dijkstra算法
仅谈谈个人对dijkstra的理解,dijkstra算法是基于邻接表实现的,用于处理单源最短路径问题(顺便再提一下,处理单源最短路径问题的还有bellman算法).开辟一个结构体,其变量为边的终点和边 ...
- Bellman算法
Bellman算法 当图有负圈的时候可以用这个判断最短路! [时间复杂度]O(\(nm\)) &代码: #include <bits/stdc++.h> using namespa ...
- 单源最短路径(dijkstra算法)php实现
做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...
- 最大流算法之EK(最短路径增广算法)
这是网络流最基础的部分--求出源点到汇点的最大流(Max-Flow). 最大流的算法有比较多,本次介绍的是其中复杂度较高,但是比较好写的EK算法.(不涉及分层,纯粹靠BFS找汇点及回溯找最小流量得到最 ...
- 【算法设计与分析基础】25、单起点最短路径的dijkstra算法
首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...
- 最短路径问题---Dijkstra算法详解
侵删https://blog.csdn.net/qq_35644234/article/details/60870719 前言 Nobody can go back and start a new b ...
- 数据结构与算法--最短路径之Floyd算法
数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...
随机推荐
- poj 3321 Apple Tree dfs序+线段树
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Description There is an apple tree outsid ...
- mac pycharm配置 python
一.首先查看自己安装的python的路径 在terminal运行 which python(which命令只是根据PATH环境变量找) 例如:/usr/bin/python 二.设置python版本 ...
- 关于oracle的准备
作者:Steven Feuerstein 提高编写PL/SQL代码数量及质量的四个简单易行指导方针 我从1990年就开始编写PL/SQL代码.这意味着我已经编写了几万行的软件代码,但我确信,其中的绝大 ...
- java高薪之路__001_类
Java中内部类分四种:成员内部类.局部内部类.静态内部类和匿名内部类.要注意静态内部类的调用方式与其他不同,采用的是类似调用类中的静态属性.静态方法的方式 Multi Level 调用不同类中的相同 ...
- JAVA 使用POI导出数据格式为Execl
需要下载一个poi的jar包. 控制器 @Override public void getContractListExecl(Contract contract, BindingResult resu ...
- 聊天界面之气泡文本cell(二)使用Autolayout
聊天界面主要是cell的动态高度计算和效率的问题,参考网上的两篇文章: 1.优化UITableViewCell高度计算的那些事 http://www.cocoachina.com/ios/20150 ...
- SQL语句中SUM与COUNT的区别
SUM是对符合条件的记录的数值列求和 COUNT 是对查询中符合条件的结果(或记录)的个数 例如: 表fruit id name price 1 apple 3.00 2 ...
- Android Gradle的使用
说明: 在Android Studio中的Terminal可以直接使用Gradle命令行,不需要配置环境,而想直接在电脑的命令行使用Gradle命令行, 则需要配置环境,Window下配置Gradle ...
- [转]去除inline-block元素间间距的N种方法
来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com] 一.现象描述 真正意义上的inline-block水平呈现的元素间,换行显示或空格分隔的情况下会有间距,很简单的个例子 ...
- sql server 自增长id 允许插入显示值
--允许插入显示插入主键id的值SET IDENTITY_INSERT [T0002_SType] ON 执行insert插入语句------------------ --关闭 插入显示值SET ID ...