Dijkstra算法的c++实现
Dijkstra算法:
1 Dijkstra算法解决带权图的单源最短路径问题,权值要不小于0。
2 顶点集合S,保存已经找到的从源点s找到的顶点。
3 顶点集合V,保存剩下的节点,最小优先队列Q,存储V中节点。
4 使用最小优先队列,寻找下一个顶点距离最近的节点u,然后使用w(s,u)来松弛u的邻接点v。
===================================================================
1 //prev[],dist[],distance[][] 2 #include<iostream> 3 #include<stdio.h> 4 #include<limits.h> 5 using namespace std; 6 const int MAX = 100; 7 int c[MAX][MAX]; 8 int dist[MAX]; 9 int prev[MAX]; 10 int S[MAX]; 11 void dijkstra(int s,int n,int dist[],int prev[],int c[][MAX]) 12 { 13 for(int i = 1; i <= n; i++)//数组下标都从1开始 14 { 15 dist[i] = c[s][i]; 16 S[i] = 0;//0代表,i不再S集合中 17 if(i != s && dist[i] < INT_MAX) 18 prev[i] = s;//i的前一个节点 19 else 20 prev[i] = -1;//prev数组初始化 21 } 22 S[s] = 1;//源点s放在结合S中 23 //选择不在S集合中的具有最短距离的顶点u 24 int u; 25 for(int i = 1; i < n; i++) 26 { 27 int mindis = INT_MAX; 28 for(int j = 1; j <= n; j++) 29 { 30 if(!S[j] && dist[j] < mindis) 31 { 32 u = j; 33 mindis = dist[j]; 34 } 35 } 36 S[u] = 1; 37 for(int k = 1; k <= n; k++) 38 { 39 if(!S[k] && c[u][k] < INT_MAX && dist[u] + c[u][k] < dist[k]) 40 { 41 dist[k] = dist[u] + c[u][k]; 42 prev[k] = u; 43 } 44 } 45 } 46 } 47 int main() 48 { 49 freopen("graph.txt","r",stdin); 50 int line,numberVertex; 51 cin >> numberVertex >> line; 52 //init c[][] 53 for(int i = 1; i <= numberVertex; i++) 54 for(int j = 1; j <= numberVertex; j++) 55 if(i != j) 56 c[i][j] = INT_MAX; 57 //c[][]对角线上为0 58 int p,q,len; 59 for(int i = 1; i <= line; i++) 60 { 61 cin >> p >> q >> len; 62 if(len < c[p][q]) 63 c[p][q] = len; 64 } 65 for(int i =1; i <= numberVertex; i++) 66 { 67 for(int j = 1; j <= numberVertex; j++) 68 cout << c[i][j] << " "; 69 cout << endl; 70 } 71 //init dist[] 72 for(int i = 1; i <= numberVertex; i++) 73 dist[i] = INT_MAX; 74 dijkstra(1,numberVertex,dist,prev,c); 75 cout << dist[numberVertex] << endl; 76 return 0; 77 }
1 dist[v]保存的是从源点到这个点的最短距离;
2 prev[v]保存的是从源点到这个点的最短路径中,这个点的前一个节点
3 c[][]存储的是顶点之间的权值
转载于:https://www.cnblogs.com/majianbin/archive/2013/05/04/3059630.html
Dijkstra算法的c++实现相关推荐
- [C] Dijkstra算法——通过边实现松弛
Dijkstra算法--通过边实现松弛 本算法学习指定一个点(源点)到其余各个顶点的最短路径,也叫做单源最短路径例如求下图1号顶点到2,3,4,5,6号顶点的最短路径 这个时候你可能就要问了,为什么不 ...
- 经典算法研究系列:二、Dijkstra 算法初探
经典算法研究系列:二.Dijkstra 算法初探 July 二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...
- 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...
问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...
- 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)
目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...
- 【算法】【ACM】深入理解Dijkstra算法(单源最短路径算法)
Dijkstra算法是用来求解从某个源点到其他各顶点的最短路径(单源最短路径). 下面的Dijkstra算法的讲解都是基于这个有向图,在遇到其他问题可以类比. 算法的基本思想: 把图中的定点分成两组, ...
- 拿来就能用!Dijkstra 算法实现快递路径优化
作者 | 李秋键 责编 | 伍杏玲 出品 | AI科技大本营(ID:rgznai100) 近几年来,快递行业发展迅猛,其中的程序设计涉及到运送路径的最优选择问题,下面我们尝试模拟实现快递路径优化问题, ...
- 基于Dijkstra算法的武汉地铁路径规划!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:牧小熊,华中农业大学,Datawhale原创作者 前言 最近爬取了 ...
- 【路径规划】Dijkstra算法——超详细原理图解
Dijkstra算法详解 1. Dijkstra算法原理 1.1. 有向图的Dijkstra算法 1.2. 无向图和栅格网络的拓展 1.2.1. 无向图 1.2.2. 栅格网络 2. Di ...
- 图论-最短路Dijkstra算法详解超详 有图解
整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...
- 【Dijkstra算法】未优化版+优先队列优化版
https://blog.csdn.net/YF_Li123/article/details/74090301 Dijkstra算法伪代码://G为图:数组d为源点到达各点的最短路径长度,s为起点 D ...
最新文章
- 试用最新版本的live writer发一篇日志看看
- centos vim配置高亮语法和格式化粘贴
- elasticsearch安装过程中的license问题解决办法
- 在php中单引号和双引号的区别错误的是___________,浅谈PHP中单引号和双引号到底有啥区别呢?...
- HCIE培训后的面试小诀窍
- cmd命令操作Mysql数据库,命令行操作Mysql
- apt-get for ubuntu 工具简介
- python随机生成列表_python 实现快速生成连续、随机字母列表
- 快速向表中插入大量数据Oracle中append与Nologgin的作用
- Eclipse中【Maven下载时,下载源码】设定方法
- 国内外优秀的源码网站
- centos7 备份系统
- 一站式跨境电商免费开源ERP平台,简洁的操作,助您高效工作
- 超详细的Latex快速基础入门(第一节)
- 《德鲁克管理思想精要》读书笔记3 - 管理的新范式?
- 安装kubernetes dashboard时开发环境,运行gulp local-up-cluster任务一直显示wating for a heapster
- Newtonsoft.Json.JsonSerializationException
- 【寒假每日一题】分巧克力(个人练习)详细题解+推导证明(第八天)附带转载程序员壁纸
- 《时空测量原理》韩春好著
- vuepress侧边栏配置_VuePress默认主题配置(default theme config) - VuePress中文网
热门文章
- Inside Dynamics Axapta源代码赏析(五)
- Windows核心编程 第三章 内核对象
- 【Android 逆向】Android 系统文件分析 ( /proc/pid 进程号对应进程目录 | oom_adj | maps | smaps | mem | task | environ )
- 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( “Python“ 因为出现问题而无法打开 )
- 【Java 集合】Java 集合的线程安全性 ( 加锁同步 | java.utils 集合 | 集合属性 | java.util.concurrent 集合 | CopyOnWrite 机制 )
- Linux入门:部署JavaWeb项目
- InnoDB Master Thread I/O Rate详解
- 【KEIL·单片机·扫盲贴】关于ARM单片机程序内存使用情况的细致讨论。
- Python3 之 JSON
- Linux下设置时区(通过shell设置和程序中设置)及程序中设置环境变量