具有负边的图最短路径算法
来源:互联网 发布:php开源考试系统 编辑:程序博客网 时间:2024/05/21 13:58
不带赋权的图最短路径算法参考前面的最短路径算法-广度优先搜索
带赋权但不含负边的图最短路径算法参考迪克斯特拉算法
这里考虑带赋权且具有负边的最短路径(但不考虑负值圈)。
由于存在负值边,因此可能存在路径v->u->s路径长小于v->s,因此迪克斯特拉算法不再成立。
这里我们需要做个改变,首先将起始节点放入一个列表,取出一个节点v1,对于v1的某个邻接节点v2,记起始节点到v2的距离目前为d2,起始节点到v1的距离目前为d1,v1->v2的距离为d,如果d1+d < d2,则更新v2节点的距离d2,如果v2不在列表中,则将v2放回列表,继续取出下一个节点,直到列表为空。
考虑如下图:
将v5->v7的路径设为-1。因此从v1->v7的最短路径长由v1->v4->v7变为v1->v4->v5->v7,且长度变为2.
实现代码如下:
#include<iostream>using namespace std;int main(){ int input[8][8] = { {0,1,0,0,0,0,0,0}, //将起始节点放入列表,以此作为循环的开始 {0,0,2,0,1,0,0,0}, {0,0,0,0,3,10,0,0}, {0,4,0,0,0,0,5,0}, {0,0,0,2,0,2,8,4}, {0,0,0,0,0,0,0,-1}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,1,0} }; int path[8] = {0,0,999,999,999,999,999,999};//将起始节点距离声明为0,其余节点声明为无穷大 while (true) { int i = 0; while (++i < 8 && input[0][i] == 0){} //取出列表中的一个节点 if (i == 8) break;//如果列表中没有节点了,则退出循环 input[0][i] = 0;//将节点移出列表 for (int j = 1; j < 8; j++) { if (input[i][j] != 0) { int tmp = path[i] + input[i][j]; if (tmp < path[j]) { path[j] = tmp; input[0][j] = 1;//如果j节点路径信息更新了,则放入列表 } } } }}
0 0
- 具有负边的图最短路径算法
- 含有负边的图的最短路径(Bellman_ford算法)
- 图算法 具有负边值有向图的单源最短路径
- Bellman-ford算法应对有向图中有权值为负的情况下求最短路径
- 图的最短路径 Ford算法 解决负权问题
- word2vec的负采样算法
- Bellman—Ford算法实现(解决存在负边情况下单源最短路径问题)
- 算法8-11:最短路径算法之负权
- 图--单源最短路径 -Bellman Ford 算法(可以存在负权边的情况和负权回路)算法导论p362
- 赚钱啦(单源最短路径(含有负权)Bellman_Forld()算法)
- 图论算法之最短路径(具有负边值的图)
- 可以处理负权的单源最短路径的SPFA算法带图详解(自己画的图)
- 可以处理负权的单源最短路径的SPFA算法带图详解(自己画的图)
- 最短路径基本介绍(3)--Bellman-Ford算法(单源最短路径算法,可求负权)
- Bellman-ford存在负权的单元点最短路径
- AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)
- 图算法 单源最短路径 Bellman_Ford算法(边权值为负情况)
- 【算法】Bellman-Ford算法(单源最短路径问题)(判断负圈)
- nvdimm 新的内存
- 搭建java开发环境
- Linux以外的7种开源操作系统
- JDBC那些事(三)——PreparedStatement预编译对象
- Python零基础入门十九之爬虫基础知识
- 具有负边的图最短路径算法
- Spark 2.0系列之SparkSession详解
- laravel--访问器
- 谷歌官方下拉刷新功能SwipeRefreshLayout
- python2.7里边目录python列出文件夹里面的所有内容
- java上传文件到ftp服务器(匿名方式)
- 理解Base64编码
- 抢答器
- HDFS架构