单源最短路径-分支限界法-优先队列式分支限界法-Dijkstra
问题描述:
给定一个带权有向图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相关推荐
- 【算法设计与分析】 单源最短路径(贪心算法) Dijkstra
[算法设计与分析] 单源最短路径(贪心算法) Dijkstra [问题描述] Dijkstra算法解决的是带权重的有向图上单源最短路径问题.所有边的权重都为非负值.设置顶点集合S并不断地作贪心选择来扩 ...
- (单源最短路径)一文搞懂dijkstra算法
前言 大家好,我是bigsai,今天给大家讲讲Dijkstra算法,下次拿着这个算法找女神少绕路,有女朋友的可以试试行不行的通. 对于Dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较 ...
- 单源最短路径的迪克斯特拉(Dijkstra)算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点(节点需为源点)到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展 ...
- 图论-单源最短路径算法(拓扑,Dijkstra,Floyd,SPFA)
前言 单源最短路径是学习图论算法的入门级台阶,但刚开始看的时候就蒙了,什么有环没环,有负权没负权,下面就来总结一下求单源最短路径的所有算法以及其适用的情况. 单源最短路径 设定图中一个点为源点,求其他 ...
- 装载问题-分支限界法(队列式分支限界法,优先队列式分支限界法)
问题描述 有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且 ∑i=1nwi≤c1+c2\sum^n_{i=1}w_i≤c_1+c_2i=1∑n ...
- dijkstra最短路径算法视频_单源最短路径(1):Dijkstra 算法
一:背景 Dijkstra 算法(中文名:迪杰斯特拉算法)是由荷兰计算机科学家 Edsger Wybe Dijkstra 提出.该算法常用于路由算法或者作为其他图算法的一个子模块.举例来说,如果图中的 ...
- 单源最短路径(1):Dijkstra算法
原文: https://subetter.com/algorith... 一:背景 Dijkstra算法(中文名:迪杰斯特拉算法)是由荷兰计算机科学家Edsger Wybe Dijkstra提出.该算 ...
- 【算法】【ACM】深入理解Dijkstra算法(单源最短路径算法)
Dijkstra算法是用来求解从某个源点到其他各顶点的最短路径(单源最短路径). 下面的Dijkstra算法的讲解都是基于这个有向图,在遇到其他问题可以类比. 算法的基本思想: 把图中的定点分成两组, ...
- 分支限界法:单源最短路径--dijkstra算法
单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...
最新文章
- PCL:求两条直线交点
- eCos Mbox机制
- 用TensorFlow可视化卷积层的方法
- ITK:观察事件 Observe An Event
- SAP 销售云支持的丰富的报表显示类型
- springboot mybatis 热加载mapper.xml文件(最简单)
- 晋中计算机专业对口大学,山西晋中计算机专业好就业吗?,计算机专业
- pandas基础-Python3
- 解开Android应用程序组件Activity的singleTask之谜(3)
- Windows 下 Git 的安装及如何与码云协作
- luogu P1069 细胞分裂
- 安装pytorch1.10.0/cu111时报错:no matching distribution found for torchvision==0.11.0+cu111
- 几种常见嵌入式实时操作系统简介
- The Beer House 终于运行起来了
- Mysql-ERROR:1055错误修复
- 【数学基础】欧式变换、相似变换、仿射变换、射影变换
- 2019在职跨考南大计算机非全日制专硕-初试364经验帖
- [高数][高昆轮][高等数学上][第二章-导数与微分]04.隐函数及由参数方程所确定的函数的导数...
- android adb 存储权限,android adb 权限修改
- Tensorflow深度学习学习笔记
热门文章
- [数论+模板] 分解质因数(模板)
- Cocos2D游戏项目CCTableView在Xcode7.2下的无法滚动问题
- java简单实现布谷鸟过滤器的
- qrcodejs2的错误、公众号识别不了二维码、公众号识别二维码没反应
- H5+微信公众号扫二维码页面跳转功能 vue实现
- 4.11每日一题之亲戚(洛谷c++)|简单并查集
- ApriTag2 检测方法
- 为什么 K8s 在阿里能成功(转)
- python简单算法题_python - 简单算法题 - 列表偏移
- oeasy和你玩转微信公众号-刘青-专题视频课程