更新所有的边,每条边更新V-1次,时间复杂度为O(V*E).

有些更新操作是重复了的,这里可以考虑检查多余的重复操作作,如果没有更新发生,则立即终止算法。

#include<iostream> #include<malloc.h> #include<queue> #include <algorithm> #include<stdlib.h> #include<functional> using namespace std; #define maxNum 100 //定义邻接举证的最大定点数 #define maxWeight 1000000 //边权最大值 //顶点信息 typedef struct { int id; int dist; }node; //图的邻接矩阵表示结构 typedef struct { //char v[maxNum];//图的顶点信息 node v[maxNum]; int e[maxNum][maxNum];//图的顶点信息 int vNum;//顶点个数 int eNum;//边的个数 }graph; //函数声明 void createGraph(graph *g);//创建图g //Bellman_ford算法 void Bellman_ford(graph *g) { int k,i,j; //初始化dist的值 for(i=1;i<=g->vNum;i++) { g->v[i].dist=maxWeight; //dist为最大值 g->v[i].id=i; } g->v[1].dist=0;//1作为源点,dist为0 for(k=1;k<=g->vNum;k++)//V-1次循环 { for(i=1;i<=g->vNum;i++) { for(j=1;j<=g->vNum;j++) { if(g->e[i][j]!=maxWeight) if(g->v[j].dist>(g->v[i].dist+g->e[i][j])) g->v[j].dist=g->v[i].dist+g->e[i][j]; } } //for(int p=1;p<=g->vNum;p++)//输出每次更新完以后的dist // cout<<g->v[p].dist<<" "; //cout<<endl; } } void createGraph(graph *g)//创建图g { cout<<"正在创建无向图..."<<endl; cout<<"请输入顶点个数vNum:"; cin>>g->vNum; int i,j; //构造邻接矩阵,顶点到自身的距离是无穷大的。 cout<<"输入邻接矩阵权值:"<<endl; for(i=1;i<=g->vNum;i++) for(j=1;j<=g->vNum;j++) { cin>>g->e[i][j]; if(g->e[i][j]==0) g->e[i][j]=maxWeight; } } int main() { graph *g; g=(graph*)malloc(sizeof(graph)); createGraph(g); Bellman_ford(g); cout<<"Dijkstra算法单源(源为1)最短路径为:"<<endl; for(int k=1; k<=g->vNum; k++) { cout<<g->v[k].dist<<" "; } cout<<endl; system("pause"); return 0; } /* 正在创建无向图... 请输入顶点个数vNum:8 输入邻接矩阵权值: 0 10 0 0 0 0 0 8 0 0 0 0 0 2 0 0 0 1 0 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 -1 0 0 0 0 -2 0 0 0 0 0 0 -4 0 0 0 -1 0 0 0 0 0 0 0 0 1 0 Dijkstra算法单源(源为1)最短路径为: 0 5 5 6 9 7 9 8 请按任意键继续. . . */

ps:2011-6-15

1.修改:dist单独列出一个数组存放,不在将dist值存放在图中。

2.输出dist修改过程,发现后续的dist没有发生变化,可以通过一个检查函数来判断,如果dist前后没有发生变化则表明已经找到最短路径

代码实例:

#include<iostream> #include<malloc.h> #include<queue> #include <algorithm> #include<stdlib.h> #include<functional> using namespace std; #define maxNum 100 //定义邻接举证的最大定点数 #define maxWeight 1000000 //边权最大值 int dist[maxNum];//定义数组,默认情况下数组中的所有元素都为0 //图的邻接矩阵表示结构 typedef struct { char v[maxNum];//图的顶点信息 int e[maxNum][maxNum];//图的顶点信息 int vNum;//顶点个数 int eNum;//边的个数 }graph; //函数声明 void createGraph(graph *g);//创建图g void Bellman_ford(graph *g); //Bellman_ford算法 void Bellman_ford(graph *g) { int k,i,j,p; //初始化dist的值 for(i=1;i<=g->vNum;i++) { dist[i]=maxWeight; } dist[1]=0; for(i=1;i<=g->vNum;i++) { cout<<dist[i]<<" "; } cout<<endl; cout<<"输出"<<g->vNum<<"次迭代过程中的dist值"<<endl; for(k=1;k<=g->vNum;k++)//V-1次循环 { //更新每一条边的权值 for(i=1;i<=g->vNum;i++) { for(j=1;j<=g->vNum;j++) { if(g->e[i][j]!=maxWeight&&dist[i]!=maxWeight)//如果i->j之间存在路径 { if(dist[j]>dist[i]+g->e[i][j]) { dist[j]=dist[i]+g->e[i][j]; } } } } for(i=1;i<=g->vNum;i++) { cout<<dist[i]<<" "; } cout<<endl; } } void createGraph(graph *g)//创建图g { cout<<"正在创建无向图..."<<endl; cout<<"请输入顶点个数vNum:"; cin>>g->vNum; int i,j; //构造邻接矩阵,顶点到自身的距离是无穷大的。 cout<<"输入邻接矩阵权值:"<<endl; for(i=1;i<=g->vNum;i++) for(j=1;j<=g->vNum;j++) { cin>>g->e[i][j]; if(g->e[i][j]==0) g->e[i][j]=maxWeight; } } int main() { graph *g; g=(graph*)malloc(sizeof(graph)); createGraph(g); Bellman_ford(g); cout<<"Dijkstra算法单源(源为1)最短路径为:"<<endl; for(int k=1; k<=g->vNum; k++) { cout<<dist[k]<<" "; } cout<<endl; system("pause"); return 0; } /* 正在创建无向图... 请输入顶点个数vNum:8 输入邻接矩阵权值: 0 10 0 0 0 0 0 8 0 0 0 0 0 2 0 0 0 1 0 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 -1 0 0 0 0 -2 0 0 0 0 0 0 -4 0 0 0 -1 0 0 0 0 0 0 0 0 1 0 0 1000000 1000000 1000000 1000000 1000000 1000000 1000000 输出8次迭代过程中的dist值 0 10 10 1000000 1000000 12 9 8 0 5 10 11 14 8 9 8 0 5 5 11 14 7 9 8 0 5 5 6 9 7 9 8 0 5 5 6 9 7 9 8 0 5 5 6 9 7 9 8 0 5 5 6 9 7 9 8 0 5 5 6 9 7 9 8 Dijkstra算法单源(源为1)最短路径为: 0 5 5 6 9 7 9 8 请按任意键继续. . . */

转载于:https://www.cnblogs.com/xwdreamer/archive/2011/06/14/2297002.html

含有负边的图的最短路径(Bellman_ford算法)相关推荐

  1. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  2. 【数据结构】图(最短路径Dijkstra算法)的JAVA代码实现

    最短路径的概念 最短路径的问题是比较典型的应用问题.在图中,确定了起始点和终点之后,一般情况下都可以有很多条路径来连接两者.而边或弧的权值最小的那一条路径就称为两点之间的最短路径,路径上的第一个顶点为 ...

  3. 有向无环图的最短路径求解算法

    对于最短路径问题,Dijkstra算法只能求解所有边的权值都是非负的加权有向图,而Bellman-Ford算法虽然可以求解有负权值边的图的最短路径,但效率并不高.对于有向无环图,下面这种基于Dijks ...

  4. c++ 遍历所有点且距离最短_C/C++ 图的最短路径 Dijkstra 算法

    作者:小石王 链接:https://www.cnblogs.com/xiaoshiwang/p/9442391.html 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最 ...

  5. 三牛三虎过河问题--图的最短路径dijkstra算法--简单的Python实现

    问题:三头牛三只虎要过河,船需要一只动物来划,另外至多还能载一物,而只有一头牛和一只虎会划船,并且当虎的数量多于牛的数量时,虎要吃牛,请设计一个安全渡河方案,并使渡河次数尽量少. 我们用一个数组来表示 ...

  6. 图的最短路径dijkstra算法

    想法是这样的: 1. 最开始要建立4个list,分别存储 a. 所有的Vertex: allVertex[] b. 一个空的Vertex list: emptyVertex[] c. 一个前缀表 pr ...

  7. 图论3之图的最短路径算法

    上一篇我们讨论了图的遍历,实际问题中图的深度遍历是我们更常用的,除了图的遍历,我们一般遇到的问题更多是关于图的路径的问题.本篇将介绍图的四种常用遍历算法 一.深度或广度优先搜索算法(解决单源最短路径) ...

  8. 图的最短路径--单源、多源最短路径

    最短路径 –在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的路劲. 单源最短路径 –从某固定源点出发的最短路径 无权图的最短路径 按照路径长度递增的顺序找出源点到各个顶点的最短路径 类似于 ...

  9. 图论算法(三)--最短路径 的Bellman-Flod [ 带负权值图 ] 的解法(JAVA )

    Bellman-Flod算法 对于带有负权值的图,我们已经不能通过Dijkstra算法进行求解了 原因:Dijkstra每次都会找一个距源点(设为s)最近的点,然后将该距离定为这个点到源点的最短路径: ...

最新文章

  1. python常用命令汇总-python数据分析之pandas常用命令整理
  2. 对简单单元格的增删改
  3. Thymeleaf循环遍历
  4. Buffers, windows, and tabs
  5. Keyword-BERT——问答系统中语义匹配的杀手锏
  6. 怎么修改ppt的虚线间隔_还有一小时下班,领导交给我一份ppt,做不完不许走!...
  7. linux关于权限的案例,16. Linux权限管理案例1 - 警察与土匪
  8. [ASP.NET MVC]让Html.RenderAction支持Lamda表达式
  9. fs.readfile 显示html,javascript – 从fs.readFile获取数据
  10. [乐意黎原创]]CuteFTP 操作文件时,中文文件名显示乱码的解决
  11. TL9000 电信业质量体系管理标准
  12. 线上幽灵:世界头号黑客米特尼克自传
  13. 学习HALCON视觉必会的入门知识| 东哥机器视觉培训
  14. 页面监听-iframe子父页面信息传递与监听
  15. Unity—火焰特效制作
  16. RGB,CMY(K),YUV,YIQ,YCbCr颜色的转换算法(java实现)
  17. win10计算机管理找不到用户,win10重装系统后管理账户不见了,win10怎么找到管理账户?...
  18. Java实现获取long类型的随机数
  19. 导出富文本格式word
  20. 电脑没有鼠标怎么打开计算机,电脑鼠标右键菜单没有打开方式选项怎么办

热门文章

  1. python webdriver点击指令_测开系列Selenium Webdriver Python(20)--Webdriver运行原理
  2. Windows核心编程 第十七章 -内存映射文件(上)
  3. Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-上
  4. POJ 3301 三分(最小覆盖正方形)
  5. hdu1043 经典的八数码问题 逆向bfs打表 + 逆序数
  6. 【C 语言】文件操作 ( 文件加密解密 | 加密解密原理 | 对称加密原理 | 非密钥整数倍长度的数据加密处理 )
  7. 创新工场2018年夏令营DeepCamp第一套解答笔记
  8. Sql Server触发器的使用
  9. 417 Pacific Atlantic Water Flow 太平洋大西洋水流
  10. python版本的策略模式