单源最短路问题是固定一个起点,求它到其他所有点的最短路的问题。

算法:

设 d[i]  表示 起点 s 离点 i 的最短距离。

【1.初始化】  固定起点s,对所有的点 , 如果 i =  s ,   d[i]  置为 0 ;如果  i  !=  s  , d[i]  置为  INF,执行 2。

【2.更新】 update = false。  用所有的边更新所有的点离源点的距离,update = true。

            如果更新过update = true,重复执行2 ; 如果没有更新过update = false, 执行3。

【3.输出】  打印  d  数组中所求的结果。

代码:

#include <bits\stdc++.h>
using namespace std;
#define INF 2147483647
#define MAX_V 1000
#define MAX_E 2000 // 单源最短路径1(Bellman-Ford算法) struct edge{
int from,to,cost;
}; edge es[MAX_E]; //所有的边 int d[MAX_V]; //d[i]表示源点到i点的最短距离
int V,E; //V是顶点数,E是边数 //求解从s离所有点的距离
void shortest_path(int s){
for(int i = ;i < V; i++) d[i] = INF;
d[s] = ;
//用可到达的点和从这个点出发的边更新这条边到达的点与源点的距离。
//如果无点可更新,则跳出
while(true){
bool update = false;
for(int i = ;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(){
}

负圈:负圈又称负环,就是说一个全部由负权的边组成的环,这样的话不存在最短路,因为每在环中转一圈路径总长就会变小。

Bellman-Ford算法求最短路径不会经过同一个点两次。如果不存在负圈的话最多会更新 V-1 次,即每次只更新出一个点(想象一下线性存储的情况)。

如果有负圈的话会无限更新下去。

所以判断负圈是否存在只用判断是否更新了大于V-1次即可。

代码:

#include <bits\stdc++.h>
using namespace std;
#define INF 2147483647
#define MAX_V 1000
#define MAX_E 2000 // 单源最短路径1(Bellman-Ford算法) struct edge{
int from,to,cost;
}; edge es[MAX_E]; //所有的边 int d[MAX_V]; //d[i]表示源点到i点的最短距离
int V,E; //V是顶点数,E是边数 //判断是否存在负圈
bool find_negative_loop(){
memset(d,,sizeof(d)); for(int i = ;i <= V; i++){
for(int j = ;j < E; j++){
edge e = es[j];
if(d[e.to] > d[e.from] + e.cost){
d[e.to] = d[e.from] + e.cost; //如果更新了V次说明存在负圈
if(i == V) return true;
}
}
} return false;
} int main(){
}

【算法】Bellman-Ford算法(单源最短路径问题)(判断负圈)的更多相关文章

  1. 基于visual Studio2013解决算法导论之043单源最短路径dijstra矩阵

     题目 单源最短路径dijstra矩阵 解决代码及点评 // 26单源最短路径dijstra矩阵.cpp : 定义控制台应用程序的入口点. // #include <iostream> ...

  2. 基于visual Studio2013解决算法导论之042单源最短路径

     题目 单源最短路径 解决代码及点评 // 26单源最短路径bellmanford.cpp : 定义控制台应用程序的入口点. // #include <iostream> #incl ...

  3. Bellman-Ford算法 例题:P3371 单源最短路径

    看到还没人用Bellman-Ford过,赶紧水一发 lz非常弱,求各位大佬轻喷qwq 洛谷题目传送门:P3371 0."松弛"操作 如果存在一条边\((u,v)\)通过中继的方式可 ...

  4. Bellman-Ford 单源最短路径算法

    Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Leste ...

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

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

  6. Dijkstra 单源最短路径算法

    Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...

  7. Til the Cows Come Home(poj 2387 Dijkstra算法(单源最短路径))

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32824   Accepted: 11098 Description Bes ...

  8. Bellman-Ford算法 - 有向图单源最短路径

    2017-07-27  08:58:08 writer:pprp 参考书目:张新华的<算法竞赛宝典> Bellman-Ford算法是求有向图单源最短路径的,dijkstra算法的条件是图中 ...

  9. 单源最短路径算法---Dijkstra

    Dijkstra算法树解决有向图G=(V,E)上带权的单源最短路径问题,但是要求所有边的权值非负. 解题思路: V表示有向图的所有顶点集合,S表示那么一些顶点结合,从源点s到该集合中的顶点的最终最短路 ...

  10. 单源最短路径——dijkstra算法

    dijkstra算法与prim算法的区别   1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...

随机推荐

  1. Android开发中:小米2S DDMS 不显示

    参考:http://bbs.xiaomi.cn/thread-5672159-1-1.html

  2. 让html页面不缓存js的实现方法

    很多朋友都会碰到这样的情况:如果我们页面加载了js的话下次打开时也会是调用这个js缓存文件,但对于我们调试时是非常的不方便了,本文就来谈论如何解决这一问题,下面一起来看看. 不缓存JS的方法其实挺简单 ...

  3. webpack 参数1、context: path.resolve 2、path.join('', '..', 'aa') 3、 path.posix.join('static','/aa')

    1.context: path.resolve 项目入口路径 2. 3.

  4. Smalltalk

    Smalltalk is an object-oriented, dynamically typed, reflective programming language. Smalltalk was o ...

  5. 获取浏览器端的cookie方法

    代码如下: function getCookie(key){ var cookies=document.cookie; if(cookies.length>0){ var start=cooki ...

  6. echarts的下载为excel小工具

    echarts自带有下载为图片的功能,但是没有下载为excel表格的功能,个人觉得下载为表格更为需要,所以写了个工具,此工具应用有局限性,只能用于柱形图和折线图,option的series要是如下形式 ...

  7. 按时间划分备份MySQL脚本

    按时间划分备份MySQL脚本 #!/bin/bash BASE_PATH=/data/dump/ JIRA_FILE_NAME=ZY798-`date +%Y%m%d%H%M%S`; cd /usr/ ...

  8. 实现双向数据绑定mvvm

    实现双向数据绑定mvvm  

  9. 常用js方法封装

    常用js方法封装 var myJs = { /* * 格式化日期 * @param dt 日期对象 * @returns {string} 返回值是格式化的字符串日期 */ getDates: fun ...

  10. 题解 P3978 【[TJOI2015]概率论】

    这道题...好像是第一道我自己切出来的黑题... 先说一句,牛顿二项式蒟蒻并不会,可以说是直接套结论. 求诸位老爷轻喷. 这道题用卡特兰数搞. 卡特兰数这玩意从普及组初赛一路考到省选,十分有用. 如果 ...