Dijkstra算法的c++实现

Dijkstra算法:
1 Dijkstra算法解决带权图的单源最短路径问题,权值要不小于0。
2 顶点集合S,保存已经找到的从源点s找到的顶点。
3 顶点集合V,保存剩下的节点,最小优先队列Q,存储V中节点。
4 使用最小优先队列,寻找下一个顶点距离最近的节点u,然后使用w(s,u)来松弛u的邻接点v。
===================================================================

View Code

 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[][]存储的是顶点之间的权值

posted on 2013-05-04 16:44 T000ny 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/majianbin/archive/2013/05/04/3059630.html

Dijkstra算法的c++实现相关推荐

  1. [C] Dijkstra算法——通过边实现松弛

    Dijkstra算法--通过边实现松弛 本算法学习指定一个点(源点)到其余各个顶点的最短路径,也叫做单源最短路径例如求下图1号顶点到2,3,4,5,6号顶点的最短路径 这个时候你可能就要问了,为什么不 ...

  2. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  3. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

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

  4. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

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

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

  6. 拿来就能用!Dijkstra 算法实现快递路径优化

    作者 | 李秋键 责编 | 伍杏玲 出品 | AI科技大本营(ID:rgznai100) 近几年来,快递行业发展迅猛,其中的程序设计涉及到运送路径的最优选择问题,下面我们尝试模拟实现快递路径优化问题, ...

  7. 基于Dijkstra算法的武汉地铁路径规划!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:牧小熊,华中农业大学,Datawhale原创作者 前言 最近爬取了 ...

  8. 【路径规划】Dijkstra算法——超详细原理图解

    Dijkstra算法详解 1. Dijkstra算法原理  1.1. 有向图的Dijkstra算法  1.2. 无向图和栅格网络的拓展   1.2.1. 无向图   1.2.2. 栅格网络 2. Di ...

  9. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  10. 【Dijkstra算法】未优化版+优先队列优化版

    https://blog.csdn.net/YF_Li123/article/details/74090301 Dijkstra算法伪代码://G为图:数组d为源点到达各点的最短路径长度,s为起点 D ...

最新文章

  1. 试用最新版本的live writer发一篇日志看看
  2. centos vim配置高亮语法和格式化粘贴
  3. elasticsearch安装过程中的license问题解决办法
  4. 在php中单引号和双引号的区别错误的是___________,浅谈PHP中单引号和双引号到底有啥区别呢?...
  5. HCIE培训后的面试小诀窍
  6. cmd命令操作Mysql数据库,命令行操作Mysql
  7. apt-get for ubuntu 工具简介
  8. python随机生成列表_python 实现快速生成连续、随机字母列表
  9. 快速向表中插入大量数据Oracle中append与Nologgin的作用
  10. Eclipse中【Maven下载时,下载源码】设定方法
  11. 国内外优秀的源码网站
  12. centos7 备份系统
  13. 一站式跨境电商免费开源ERP平台,简洁的操作,助您高效工作
  14. 超详细的Latex快速基础入门(第一节)
  15. 《德鲁克管理思想精要》读书笔记3 - 管理的新范式?
  16. 安装kubernetes dashboard时开发环境,运行gulp local-up-cluster任务一直显示wating for a heapster
  17. Newtonsoft.Json.JsonSerializationException
  18. 【寒假每日一题】分巧克力(个人练习)详细题解+推导证明(第八天)附带转载程序员壁纸
  19. 《时空测量原理》韩春好著
  20. vuepress侧边栏配置_VuePress默认主题配置(default theme config) - VuePress中文网

热门文章

  1. Inside Dynamics Axapta源代码赏析(五)
  2. Windows核心编程 第三章 内核对象
  3. 【Android 逆向】Android 系统文件分析 ( /proc/pid 进程号对应进程目录 | oom_adj | maps | smaps | mem | task | environ )
  4. 【错误记录】Mac 中 IntelliJ IDEA 运行 Python 程序报错 ( “Python“ 因为出现问题而无法打开 )
  5. 【Java 集合】Java 集合的线程安全性 ( 加锁同步 | java.utils 集合 | 集合属性 | java.util.concurrent 集合 | CopyOnWrite 机制 )
  6. Linux入门:部署JavaWeb项目
  7. InnoDB Master Thread I/O Rate详解
  8. 【KEIL·单片机·扫盲贴】关于ARM单片机程序内存使用情况的细致讨论。
  9. Python3 之 JSON
  10. Linux下设置时区(通过shell设置和程序中设置)及程序中设置环境变量