利用分支限界法求解单源最短路(Dijkstra)问题

摘要:
分枝定界法的定义:使用Bestfirstsearch算法和修剪函数的算法称为分枝定界法。分支定界法的解释:根据最佳优先原则,有选择地在其子级中展开,从而丢弃没有最优解的分支,并重复该过程,直到找到答案或没有确定解。单源最短路径问题的定义:给定有向图和起点,找到所有点的最短路径。单源最短路径的分支定界方法概述:首先将节点添加到优先级队列中,将到当前节点的最短路径作为下限,然后从队列中连续获取最佳扩展点,以观察它可以到达的所有目标节点。

分支限界法定义:采用Best fist search算法,并使用剪枝函数的算法称为分支界限法。

分支限界法解释:按Best first的原则,有选择的在其child中进行扩展,从而舍弃不含有最优解的分支,不断重复这一过程,直到找到答案或者判定无解。

分支界限法常常用到优先队列来选择最佳扩展节点,有时也会用到普通队列,以先进先出为原则来进行筛选。

单源最短路问题定义:给定有向图和起点,寻找到达所有点的最短路径。

单源最短路的分支限界法概述:首先把节点加入优先队列,以到当前节点的最短路为下界,之后不断地从队列中取出最优扩展点,观察其可抵达的所有目标节点。

若当前消耗大于等于全局上界及目标节点消耗,则放弃该节点。所示代码因没有规定终点,即每个点都要输出最小路径,则不检查这一步。

若当前路径消耗+两节点间路径消耗<目标节点目前最小消耗(即更新后下界<目标当前下界)
则用不等式左边的和替换掉右边的值,并将该目标节点加入优先队列。

循环这个过程直到队列为空,即可获得图中所有节点的最短路。

代码如下:

#include <queue>
#include <vector>

const int MAX_V = 100;//最大顶点数
const int INF = 100000;//正无穷
int cost[MAX_V][MAX_V];//节点间cost表(即图)
int d[MAX_V], V, s;//起点到各个顶点的距离,顶点数,起点
//自定义优先队列less比较函数
struct cmp
{
    bool operator()(int &a, int &b) const
    {
        //因为优先出列为greater,所以反向定义实现最小值优先
        return d[a] > d[b];
    }
};
void Dijkstra()
{
    std::priority_queue<int, std::vector<int>, cmp> pq;
    pq.push(s);
    d[s] = 0;
    while (!pq.empty())
    {
        int tmp = pq.top();pq.pop();
        for (int i = 0;i < V;++i)
        {
            if (d[i] > d[tmp] + cost[tmp][i])
            {
                d[i] = d[tmp] + cost[tmp][i];
                pq.push(i);
            }
        }
    }
}

免责声明:文章转载自《利用分支限界法求解单源最短路(Dijkstra)问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇金融系列6《借贷记交易流程》file-loader 与 url-loader 的区别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

K最短路问题(单源点最短路径+A*算法)

[cpp]view plaincopyprint? /* *算法引入: *在单源点最短路径问题中,实际运用时还需知道最短路径外,次短路或者第三短路; *即要知道多条最短路,并排出其长度增加的顺序,即为K最短路问题; * *算法思想: *单源点最短路径+高级搜索A*; *A*算法结合了启发式方法和形式化方法; *启发式方法通过充分利用图给出的信息来动...

C语言刷 堆(优先队列)

703. 数据流中的第 K 大元素 /* 小根堆 */ typedef struct { int heapCapacity; int heapSize; int *heap; } KthLargest; /* 堆顶下标: 0; parent: (k-1)/2; leftChild: 2*k + 1; rightChild: 2*k...

JS实现最短路径之迪杰斯特拉(Dijkstra)算法

最短路径:   对于网图来说,最短路径是指两个顶点之间经过的边上权值和最少的路径,我们称第一个顶点是源点,最后一个顶点是终点 迪杰斯特拉 ( Dijkstra) 算法是并不是一下子就求出 了 Vo 到V8 的最短路径,而是一步步求出它们之间顶点的最短路径,过程中都是基于已经求出的最短路径的基础上,求得更远顶点的最短路径,最终得到你要的结果   JS代码:...

文件权限及chmod使用方法

文件权限 在linux在,由于安全控制需要,对于不同的文件有不现的权限,限制不同用户的操作权限,总共有rwxXst这一些权限,我们经常使用到的是rwx,对于文件和文件夹而言,他们代表着不同的含义 对于文件 r:用户可以读取该文件,如使用命令cat w:用户可以编辑该文件,如使用命令sed -i,vi x:用户可以运行该文件,如直接./ge...

Delphi -- 创建 桌面、发送到...、快速启动栏、开始菜单、程序菜单、右键菜 单

{================================================================= 功 能: 创建 桌面、发送到...、快速启动栏、开始菜单、程序菜单、右键菜单 快捷方式 参 数: FileName : 快捷方式执行文件名 Description : 快捷方式描述信息 Arguements...

Hbase学习之windows单机版搭建

1. 下载hadoop-common-2.2.0-bin-master   hbase-1.0.2  并解压 2. 配置 修改 三个个环境变量   2.1 JAVA_HOME(如果没有配置请先配置 确保电脑中装有jdk环境)   2.2 HADOOP_HOME(hadoop-common-2.2.0-bin-master  目录)  例如C:UsersAd...