嗯....

 

dijkstra是求最短路的一种算法(废话,思维含量较低,

 

并且时间复杂度较为稳定,为O(n^2),

 

但是注意:!!!!         不能处理边权为负的情况(但SPFA可以处理,今后会讲)

 

借一个何大佬的图,因为会在代码中提到红、绿、空三种颜色,以及小v,

 

通过图会比较清晰一些:

思路大约明白了下面就呈上带批注模板代码:

 #include <cstdio>//dijkstra求最短路
 #include <cstring>
 #include <algorithm>
 using namespace std;
 ;
 int g[maxn][maxn], n, m;//g数组用来存图
 int dis[maxn], status[maxn];//dis数组中存储的是从起点到第i个点的最短路长度 

 /*status//(状态)用来存点的类型,1.已经求出最短路的点(把它想成红色,用2来表示)
 2.是从已经求出最短路的点向外延伸一次就可找到的点(把它想成绿色,用1来表示)
 3.其余还没有访问的,仍没有色(用0来表示)*/ 

 //注意每一种算法都要新开一个函数,使代码简单易懂
 void dijkstra(int start_point) {//dijkstra 最短路写法:
     memset(dis, 0x3f, sizeof(dis));//将dis数组中的每一个元素都设为正无穷,
     //因为后面要用它与更小的最短路进行比较,所以它为最大,且定义为正无穷
     dis[start_point] = ;//确定边界,起点的最短路一定为0
     status[start_point] = ;//起点已求出最短路,首先标记为绿色,进行分析
     ; ti < n; ++ti) //枚举n次
     {
         ;//将小V初始化为-1(小V即为要找的点)
         ; i <= n; ++i) //再次进行枚举
         {
             ) //如果i点为绿色
             {
                  || dis[i] < dis[vertex_to_pick])
                 //如果v还没有被更新或者说是找到一个点i比点v到出发点的距离更近,则也进行更新
                  {
                     vertex_to_pick = i;//进行更新
                 }
             }
         }
         ) {
             break;//如果找不到下一个点,则退出
         }
         status[vertex_to_pick] = ;//将已经更新好的最近的v添加到red集合
         ; i <= n; ++i)
         //从找到的v点进行更新dis数组
         {
              || status[i] == ) //如果i点还没有添加到red集合
             {
                 )// 并且满足从小v这个点到i点有距离
                 {
                     status[i] = ;//再次将i点加入绿色集合,进行循环,找到所有相邻点
                     dis[i] = min(dis[i], dis[vertex_to_pick] + g[vertex_to_pick][i]);//更新i点的最短路
                 }
             }
         }
     }
 }

 int main() {
     //主函数进行输入、调用、输出
     memset(g, -, sizeof(g));
     scanf("%d%d", &n, &m);
     ; i < m; ++i) {
         int u, v, w;
         scanf("%d%d%d", &u, &v, &w);
         g[u][v] = g[v][u] = w;
     }
     dijkstra();
     printf("%d",dis[n]);
     ;
 }

多背几遍应该能明白,   反正一直除了更新就是更新.....

关于dijkstra求最短路(模板)的更多相关文章

  1. ACM - 最短路 - AcWing 849 Dijkstra求最短路 I

    AcWing 849 Dijkstra求最短路 I 题解 以此题为例介绍一下图论中的最短路算法.先让我们考虑以下问题: 给定一个 \(n\) 个点 \(m\) 条边的有向图(无向图),图中可能存在重边 ...

  2. Aizu-2249 Road Construction(dijkstra求最短路)

    Aizu - 2249 题意:国王本来有一个铺路计划,后来发现太贵了,决定删除计划中的某些边,但是有2个原则,1:所有的城市必须能达到. 2:城市与首都(1号城市)之间的最小距离不能变大. 并且在这2 ...

  3. acwing 850. Dijkstra求最短路 II 模板

    地址 https://www.acwing.com/problem/content/description/852/ 给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求 ...

  4. Dijkstra算法求最短路模板

    Dijkstra算法适合求不包含负权路的最短路径,通过点增广.在稠密图中使用优化过的版本速度非常可观.本篇不介绍算法原理.只给出模板,这里给出三种模板,其中最实用的是加上了堆优化的版本 算法原理 or ...

  5. 850. Dijkstra求最短路 II(堆优化模板)

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行 ...

  6. 849. Dijkstra求最短路 I(模板)

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...

  7. acwing 849 Dijkstra求最短路 I 模板

    地址 https://www.acwing.com/problem/content/description/851/ 给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出 ...

  8. 850. Dijkstra求最短路 II

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...

  9. 849. Dijkstra求最短路 I

    给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...

随机推荐

  1. [原]NYOJ-开灯问题-77

    大学生程序代写 //http://acm.nyist.net/JudgeOnline/problem.php?pid=77 /*题目77题目信息运行结果本题排行讨论区开灯问题 时间限制:3000 ms ...

  2. Web实现音频、视频通信

    Google开源实时通信项目WebRTC Google正式开源了WebRTC实时通信项目,希望浏览器厂商能够将该技术内建在浏览器中,从而使Web应用开发人员能够通过HTML标签和JavaScript ...

  3. 【C++ Primer 5th】Chapter 1

    1. 每个C++都包含至少一个函数,其中一个必须为main函数,且 main 函数的返回类型必须为 int. 2. 函数定义包括:返回类型,函数名,形参列表,函数体 3. main 函数返回值用来指示 ...

  4. bzoj 4372 烁烁的游戏 —— 动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 本以为和 bzoj3730 一样,可以直接双倍经验了: 但要注意一下,树状数组不能查询 ...

  5. Poj 2602 Superlong sums(大数相加)

    一.Description The creators of a new programming language D++ have found out that whatever limit for ...

  6. 获得Azure订阅LoadBalancer的脚本

    有客户希望可以通过一条命令获得一个Azure订阅中所有的负载均衡器. 目前在Azure的powershell中是没有这中命令的.但我们可以通过脚本的方式实现. 下面就是获得所有负载均衡的脚本: par ...

  7. Python:生成器表达式

    转于:http://www.cnblogs.com/liu-shuai/p/6098218.html 博主:刘-帅 简介: 生成器表达式并不真正的创建数字列表,而是返回一个生成器对象,此对象在每次计算 ...

  8. Python函数(十一)-生成器

    首先看一下什么是列表生成式 >>> [i*2 for i in range(10)] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> ...

  9. C语言学习笔记--const 和 volatile关键字

    1.const关键字 (1)const 修饰的变量是只读的,它不是真正的常量,本质还是变量,只是告诉编译器不能出现在赋值号左边! (2)const 修饰的局部变量在栈上分配空间 (3)const 修饰 ...

  10. 面试题: !=!=未看12 略多 sql语句练习 非常 有用

    JAVA面试总结 2015年03月25日 16:53:40 阅读数:4306 刚才看到的,先转载过来,没准以后用到…… 面试总结 2013年8月6日: 问题2:Hibernate的核心接口有哪些?   ...