最短路径问题——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算 ...
随机推荐
- 设置core环境
void dummy_function (void){ unsigned char *ptr = 0x00; *ptr = 0x00;} int main (void){ dummy_function ...
- KVC与KVO
KVC:键值编码(Key-Value-Coding),是一个非正式的Protocol,提供一种机制间接访问对象的属性,是路径访问的规范: KVO:键值观察 (Key-Value-Observe),是基 ...
- 解决Jenkins console输出乱码
背景 Jenkins console输出乱码,如 ������������� 1 解决办法 Jenkins Master 设置utf8 encoding Tomcat 启动脚本 export JAVA ...
- PHP文本框的值随下拉框改变
初学PHP,下面是实现文本框内容随下拉框变化的代码实现: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- memcache内存估算整理
参考文章: http://blog.csdn.net/tonyxf121/article/details/7906428 http://zhihuzeye.com/archives/2361 memc ...
- 查看rpm和war包内容
解压rpm包的内容:(没有安装,就像解压tgz包一样rpm包)rpm2cpio *.rpm | cpio -div 解压war包的内容: jar -xvf project.war 解压到当前目录
- Workspace defines a VM that does not contain a valid jre/lib/rt.jar: C:\Program Files\Java\jre7
Maven编译时两则信息 (Workspace以及default classpath container) 博客分类: Java 使用Maven一年有余,却总是被两则不起眼的编译信息困扰,终想查明 ...
- 与Status Bar和Navigation Bar相关的一些东西
Android Navigation Bar Status Bar 与StatusBar和NavigationBar相关的东西有两种,一是控制它们的显示与隐藏,二是控制它们的透明与否及背景. 在2 ...
- 如何设置WebViewer的参数栏显示状态
当为用户提供数据过滤功能时,需要为报表添加参数,而很多应用场景下,在初次展现报表时就为报表会展现全部的数据,然后再通过参数供用户选择,从而实现数据过滤,而一旦为参数设置默认值,参数面板就会自动隐藏.导 ...
- iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)
iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存 ...