描述:

求图中某一点到其他任一点的最短距离。

操作:

1. 初始化

结果保存在一个dist数组里,源点的结果初始化为0,其他初始化为无穷大(如INT32_MAX)。

2. 计算:

两重for循环,第一层,迭代n - 1次(n为节点数);

      第二层,遍历每条边,如果其源点对应的距离加上边权重小于终点对应距离,则更新终点最短距离;

3. 判断负权环:

当步骤二计算完时,遍历左右边,看是否存在某条边(u, v),有d[u] + w(u, v) < d[v],即还可以更新,如存在则存在负权环。

证明:

求最短路证明:

一。假设某点与源点不连通。

由于初始化时,除了源点距离初始为0之外,其他点都初始化为无穷大,如果不连通,则某点所在的连通图的任一条边都不会导致更新。

二。假设x点与源点连通。

每个点都存在自己的最短路,为(e0, e1, e2, ..., ek)。

显然,源点只要经过n - 1条边就可到达任一点;  (一)

现只需证明,对x点,每次迭代(松弛),至少有一条最短边ei的距离被找到,除非已经到达x点。  (二)

  对于第一次迭代,必定更新和源点相连的所有边(如果是有向图,则是指出去的),由于源点距离是0,和其相连的都是无穷大。

    而这些往外连的边中,必有一条是x点的最短路上起始的一条边。

  则设有点k,这个点是x最短路上的一个点,下一次松弛,必能找到下一个点,且也是x的最短路上的一个点:

    由于下一次松弛将更新与k相连的所有点。

有(一)(二)可得,上面两次迭代可以找出最短路。

而关于负权环的判断:

由于负权环的存在,可以通过不断绕着走从而减小环上各个点的距离。

所以即使迭代完成,当判断是否还能更新时,会发现还是可以更新的,这就判断了存在负权环。

代码:

简单输出最短路,如果要路径可以为每个节点储存一个最后一次访问的节点,逆向遍历一遍即可得到路径。

#include <string>
#include <iostream>
#include <vector>
using namespace std; struct Edge {
int start;
int end;
int weight;
}; bool BellmanFord() {
int source = ;
int vex_num, edge_num;
cout << "Input the number of vertexs and edges:" << endl;
cin >> vex_num >> edge_num; vector<int> dist(vex_num, INT32_MAX);
dist[source] = ; vector<Edge> e;
for (int i = ; i < edge_num; i++) {
Edge et;
cin >> et.start >> et.end >> et.weight;
e.push_back(et);
} for (int i = ; i < vex_num - ; i++)
for (int j = ; j < edge_num; j++)
if (dist[e[j].start] + e[j].weight < dist[e[j].end] && dist[e[j].start] != INT32_MAX)
dist[e[j].end] = dist[e[j].start] + e[j].weight; for (int i = 0; i < dist.size(); dist++)
cout << dist[i] << endl;
}

单源最短路:Bellman-Ford算法 及 证明的更多相关文章

  1. spfa 单源最短路究极算法

    学习博客链接:SPFA 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm.     SPFA算法是西南交通大学段凡丁于1994年发表的.    从名字我 ...

  2. 2018/1/28 每日一学 单源最短路的SPFA算法以及其他三大最短路算法比较总结

    刚刚AC的pj普及组第四题就是一种单源最短路. 我们知道当一个图存在负权边时像Dijkstra等算法便无法实现: 而Bellman-Ford算法的复杂度又过高O(V*E),SPFA算法便派上用场了. ...

  3. 单源最短路:Dijkstra算法 及 关于负权的讨论

    描述: 对于图(有向无向都适用),求某一点到其他任一点的最短路径(不能有负权边). 操作: 1. 初始化: 一个节点大小的数组dist[n] 源点的距离初始化为0,与源点直接相连的初始化为其权重,其他 ...

  4. 单源最短路模板(dijkstra)

    单源最短路(dijkstra算法及堆优化) 弱化版题目链接 n^2 dijkstra模板 #include<iostream> #include<cstdio> #includ ...

  5. 单源最短路——Bellman-Ford算法

    1.Dijkstra的局限性 Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的. 列如以 ...

  6. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  7. [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  8. 用scheme语言实现SPFA算法(单源最短路)

    最近自己陷入了很长时间的学习和思考之中,突然发现好久没有更新博文了,于是便想更新一篇. 这篇文章是我之前程序设计语言课作业中一段代码,用scheme语言实现单源最段路算法.当时的我,花了一整天时间,学 ...

  9. 模板C++ 03图论算法 1最短路之单源最短路(SPFA)

    3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...

随机推荐

  1. HTML页面每次打开的时候都清除页面缓存

    解决办法为: (1) 用HTML标签设置HTTP头信息 <HEAD> <META    HTTP-EQUIV="Pragma" CONTENT="no- ...

  2. eclipse 3.7 中英文自由切换

    最近在学习Java的开发,然后又很多的资料是对于的英文环境讲解,有的资料是对应的中文环境讲解,所以很都对不上号,郁闷啊....... 而且开发的时候,每个人都使用习惯也不相同:有的人喜欢英文界面,有的 ...

  3. How To Enable EPEL Repository in RHEL/CentOS 7/6/5?

    What is EPEL EPEL (Extra Packages for Enterprise Linux) is open source and free community based repo ...

  4. Hive之 hive的三种使用方式(CLI、HWI、Thrift)

    Hive有三种使用方式——CLI命令行,HWI(hie web interface)浏览器 以及 Thrift客户端连接方式. 1.hive  命令行模式 直接输入/hive/bin/hive的执行程 ...

  5. mschart 使用心得和部署。

    参考: http://www.cnblogs.com/suguoqiang/archive/2013/01/16/2862945.html 1.在统计时可能需要多条数据,需要整合数据源 Chart1. ...

  6. 【monkeyrunner】monkeyrunner 的的方法介绍

    1.用法:MonkeyRunner.alert(message,title,okTitle) 执行当前脚本弹出一个警示对话框,用户关闭对话框后脚本才结束. message:会话弹出的内容title:会 ...

  7. VB中上传下载文件到SQL数据库

    VB中上传下载文件到SQL数据库 编写人:左丘文 2015-4-11 近期在修改一个VB编写的系统时,想给画面增加一个上传文件到数据库,并可以下载查看的功能,今天在这里,我想与大家一起分享代码,在此做 ...

  8. Educational Codeforces Round 37-G.List Of Integers题解

    一.题目 二.题目链接 http://codeforces.com/contest/920/problem/G 三.题意 给定一个$t$,表示有t次查询.每次查询给定一个$x$, $p$, $k$,需 ...

  9. C++ 并发编程 01 线程api

    1.使用多线程的好处: 提高性能,分离关注点  2. 多线程所在头文件 <thread> 3. 使用线程方式为std::thread(functioncall),如: #include & ...

  10. aix操作系统的版本中TL SP 含义

    AIX 分为四个主要的操作系统级别:版本.发行版.技术级 (TL) 和服务包 (SP).版本和发行版通常指的是 AIX 的名称,例如AIX 7.1.TL 是包含重大更新的操作系统的发行版,而 SP 包 ...