关于dijkstra求最短路(模板)
嗯....
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求最短路(模板)的更多相关文章
- ACM - 最短路 - AcWing 849 Dijkstra求最短路 I
AcWing 849 Dijkstra求最短路 I 题解 以此题为例介绍一下图论中的最短路算法.先让我们考虑以下问题: 给定一个 \(n\) 个点 \(m\) 条边的有向图(无向图),图中可能存在重边 ...
- Aizu-2249 Road Construction(dijkstra求最短路)
Aizu - 2249 题意:国王本来有一个铺路计划,后来发现太贵了,决定删除计划中的某些边,但是有2个原则,1:所有的城市必须能达到. 2:城市与首都(1号城市)之间的最小距离不能变大. 并且在这2 ...
- acwing 850. Dijkstra求最短路 II 模板
地址 https://www.acwing.com/problem/content/description/852/ 给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求 ...
- Dijkstra算法求最短路模板
Dijkstra算法适合求不包含负权路的最短路径,通过点增广.在稠密图中使用优化过的版本速度非常可观.本篇不介绍算法原理.只给出模板,这里给出三种模板,其中最实用的是加上了堆优化的版本 算法原理 or ...
- 850. Dijkstra求最短路 II(堆优化模板)
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行 ...
- 849. Dijkstra求最短路 I(模板)
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...
- acwing 849 Dijkstra求最短路 I 模板
地址 https://www.acwing.com/problem/content/description/851/ 给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出 ...
- 850. Dijkstra求最短路 II
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...
- 849. Dijkstra求最短路 I
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...
随机推荐
- leetcode 6 ZigZag Conversion(水题)
就是简单的模拟一下就可以了.但是我一开始是用一个二维char数组来存的,这样在最终扫全体时会扫很多空的位置,浪费了很多时间,所以就time limit error了. 所以改进一下就用string数组 ...
- 汇编题目:在窗口上显示Welcome to masm!
题目:在屏幕中间分别显示绿色.绿底红色.白底蓝色的字符串'welcome to masm!'. 该程序题目来自<王爽 汇编语言_第2版>的188页的说明.相关资料也在上面都有详细说明. 题 ...
- ECMAScript函数表达式
--<JavaScript高级程序设计>Chapter7总结 1.匿名函数的作用 (1)动态定义函数 var sayHi; var a=1; if (a>0) { sayHi=fun ...
- MongoDB之二基础入门(window/linux安装启动)
mongodb中有三元素:数据库,集合,文档,其中“集合”就是对应关系数据库中的“表”,“文档”对应“行”. 一window安装与启动 一. 下载 上MongoDB官网 ,下载页面:https://w ...
- css3 tranform perspective属性
perspective 属性用于规定观察点距离元素的距离, 1 观察点距离元素越近,元素变形就越大,灭点距离越近. 2 观察点距离元素越远,元素变形越小,灭点距离也就越远. 比如设置perspecti ...
- 3 K8s安裝ELK+filebeat
1 Filebeat: apiVersion: v1 kind: Service metadata: name: XX spec: ports: - name: http port: targetPo ...
- FATFS 文件系统
转载请注明出处:http://blog.csdn.net/qq_26093511/article/details/51706228 1.文件系统是什么? 负责管理和存储文件信息的软件机构称为文件管理系 ...
- Python-通过socket实现一个小型的端口检测工具
实验机器IP:192.168.220.139,端口开放情况 代码 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import ...
- mysql查询语句例题
1.一条SQL语句查询两表中两个字段 首先描述问题,student表中有字段startID,endID.garde表中的ID需要对应student表中的startID或者student表中的endID ...
- windows统计端口连接数
netstat -na -p tcp| findstr 80 | find /C "ESTABLISH" netstat -an -p tcp | find "127.0 ...