问题描述:

给定一个带权有向图G = (V, E), 其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算源到所有其他各定点的最短长度。这里路的长度是指路上各边权之和。这个问题通常成为单源最短路径问题。

解法:

用优先队列式分支限界法,代码核心跟贪心的Dijkstra算法差不多相同,要首先学会使用优先队列的使用。

贪心的Dijkstra算法实现见Dijkstra算法实现

代码:

#include <bits/stdc++.h>
using namespace std;
class MinHeapNode
{
public:int id;int length; //从起始点 v 到点 id 的距离
public:friend bool operator < (const MinHeapNode &a, const MinHeapNode &b){return a.length < b.length;}friend bool operator > (const MinHeapNode &a, const MinHeapNode &b){return a.length > b.length;}
};
const int max_ = 0x3f3f3f;
int Graph[100][100];
int dist[100];
int pre[100];
int n, m, v;
void OutPutPath(int i)
{if(i == pre[i]){printf("%d", i);return;}else{OutPutPath(pre[i]);printf(" %d", i);}
}
void OutPut()
{for(int i = 1; i <= n; ++i){if(i != v){printf("点 %d 到 %d 的最短距离是 %d\n", v, i, dist[i]);printf("路径为:");OutPutPath(i);printf("\n");}}
}
void ShortestPaths()
{priority_queue<MinHeapNode, vector<MinHeapNode>, greater<MinHeapNode> > q; // 小顶堆memset(dist, max_, sizeof(dist));dist[v] = 0; //不要忘了这里的初始化pre[v] = v;MinHeapNode cur_p;cur_p.id = v;cur_p.length = 0;q.push(cur_p);while(true){if(q.empty() == 1)break;cur_p = q.top(); //取出堆顶的点q.pop(); // 在优先队列中删除刚取出的点
//        cout << q.size() << endl;for(int i = 1; i <= n; ++i){if(Graph[cur_p.id][i] != max_ && (cur_p.length + Graph[cur_p.id][i] < dist[i])){dist[i] = cur_p.length + Graph[cur_p.id][i];pre[i] = cur_p.id;MinHeapNode temp;temp.id = i;temp.length = dist[i];q.push(temp);}}}}
void InPut()
{int x, y, len;scanf("%d %d %d", &v, &n, &m);memset(Graph, max_, sizeof(Graph));for(int i = 1; i <= m; ++i){scanf("%d %d %d", &x, &y, &len);Graph[x][y] = Graph[y][x] = len;//printf("%d\n", i);}
}
int main()
{InPut();ShortestPaths();OutPut();
}

测试样例:


输入:

1 5 7
1 2 10
1 5 100
1 4 30
2 3 50
3 5 10
4 3 20

4 5 60

输出:

点 1 到 2 的最短距离是 10
路径为:1 2
点 1 到 3 的最短距离是 50
路径为:1 4 3
点 1 到 4 的最短距离是 30
路径为:1 4
点 1 到 5 的最短距离是 60

路径为:1 4 3 5

运行截图:

单源最短路径-分支限界法-优先队列式分支限界法-Dijkstra相关推荐

  1. 【算法设计与分析】 单源最短路径(贪心算法) Dijkstra

    [算法设计与分析] 单源最短路径(贪心算法) Dijkstra [问题描述] Dijkstra算法解决的是带权重的有向图上单源最短路径问题.所有边的权重都为非负值.设置顶点集合S并不断地作贪心选择来扩 ...

  2. (单源最短路径)一文搞懂dijkstra算法

    前言 大家好,我是bigsai,今天给大家讲讲Dijkstra算法,下次拿着这个算法找女神少绕路,有女朋友的可以试试行不行的通. 对于Dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较 ...

  3. 单源最短路径的迪克斯特拉(Dijkstra)算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点(节点需为源点)到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展 ...

  4. 图论-单源最短路径算法(拓扑,Dijkstra,Floyd,SPFA)

    前言 单源最短路径是学习图论算法的入门级台阶,但刚开始看的时候就蒙了,什么有环没环,有负权没负权,下面就来总结一下求单源最短路径的所有算法以及其适用的情况. 单源最短路径 设定图中一个点为源点,求其他 ...

  5. 装载问题-分支限界法(队列式分支限界法,优先队列式分支限界法)

    问题描述  有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且            ∑i=1nwi≤c1+c2\sum^n_{i=1}w_i≤c_1+c_2i=1∑n​ ...

  6. dijkstra最短路径算法视频_单源最短路径(1):Dijkstra 算法

    一:背景 Dijkstra 算法(中文名:迪杰斯特拉算法)是由荷兰计算机科学家 Edsger Wybe Dijkstra 提出.该算法常用于路由算法或者作为其他图算法的一个子模块.举例来说,如果图中的 ...

  7. 单源最短路径(1):Dijkstra算法

    原文: https://subetter.com/algorith... 一:背景 Dijkstra算法(中文名:迪杰斯特拉算法)是由荷兰计算机科学家Edsger Wybe Dijkstra提出.该算 ...

  8. 【算法】【ACM】深入理解Dijkstra算法(单源最短路径算法)

    Dijkstra算法是用来求解从某个源点到其他各顶点的最短路径(单源最短路径). 下面的Dijkstra算法的讲解都是基于这个有向图,在遇到其他问题可以类比. 算法的基本思想: 把图中的定点分成两组, ...

  9. 分支限界法:单源最短路径--dijkstra算法

    单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...

最新文章

  1. PCL:求两条直线交点
  2. eCos Mbox机制
  3. 用TensorFlow可视化卷积层的方法
  4. ITK:观察事件 Observe An Event
  5. SAP 销售云支持的丰富的报表显示类型
  6. springboot mybatis 热加载mapper.xml文件(最简单)
  7. 晋中计算机专业对口大学,山西晋中计算机专业好就业吗?,计算机专业
  8. pandas基础-Python3
  9. 解开Android应用程序组件Activity的singleTask之谜(3)
  10. Windows 下 Git 的安装及如何与码云协作
  11. luogu P1069 细胞分裂
  12. 安装pytorch1.10.0/cu111时报错:no matching distribution found for torchvision==0.11.0+cu111
  13. 几种常见嵌入式实时操作系统简介
  14. The Beer House 终于运行起来了
  15. Mysql-ERROR:1055错误修复
  16. 【数学基础】欧式变换、相似变换、仿射变换、射影变换
  17. 2019在职跨考南大计算机非全日制专硕-初试364经验帖
  18. [高数][高昆轮][高等数学上][第二章-导数与微分]04.隐函数及由参数方程所确定的函数的导数...
  19. android adb 存储权限,android adb 权限修改
  20. Tensorflow深度学习学习笔记

热门文章

  1. [数论+模板] 分解质因数(模板)
  2. Cocos2D游戏项目CCTableView在Xcode7.2下的无法滚动问题
  3. java简单实现布谷鸟过滤器的
  4. qrcodejs2的错误、公众号识别不了二维码、公众号识别二维码没反应
  5. H5+微信公众号扫二维码页面跳转功能 vue实现
  6. 4.11每日一题之亲戚(洛谷c++)|简单并查集
  7. ApriTag2 检测方法
  8. 为什么 K8s 在阿里能成功(转)
  9. python简单算法题_python - 简单算法题 - 列表偏移
  10. oeasy和你玩转微信公众号-刘青-专题视频课程