关于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行每行包 ...
随机推荐
- [原]NYOJ-大数阶乘-28
大学生程序代写 //http://acm.nyist.net/JudgeOnline/problem.php?pid=28 /*题目28题目信息运行结果本题排行讨论区大数阶乘 时间限制:3000 ms ...
- Nginx+ffmpeg的HLS开源服务器搭建配置及开发详
本文概述: 至目前为止,HLS 是移动平台上非常重要并十分流行的流媒体传输协议.做移动平台的流媒体开发,不知道它不掌握它 ,真是一大遗憾.而HLS的平台搭建有一定的难度,本文针对对该方向有一定了解的朋 ...
- G 唐纳德与子串(easy)(华师网络赛---字符串,后缀数组)(丧心病狂的用后缀自动机A了一发Easy)
Time limit per test: 1.0 seconds Memory limit: 256 megabytes 子串的定义是在一个字符串中连续出现的一段字符.这里,我们使用 s[l…r] 来 ...
- bzoj 2002: 弹飞绵羊 Link-Cut-Tree
题目: Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置, ...
- 洛谷【P1303】A*B Problem
题目传送门:https://www.luogu.org/problemnew/show/P1303 高精度乘法板子题,灵性地回忆一下小学时期列竖式的草稿纸即可. 时间复杂度:\(O(len^2)\) ...
- poj 2187 Beauty Contest —— 旋转卡壳
题目:http://poj.org/problem?id=2187 学习资料:https://blog.csdn.net/wang_heng199/article/details/74477738 h ...
- ECMAScript中面向对象的程序设计思想总结
<JavaScript高级程序设计>Chapter6笔记 1.ECMAScript内部值属性:数据属性和访问器属性 1)数据属性 数据属性的4个特性: configurable:表示能否通 ...
- java流类
总结:new FileInputStream package com.ds; import java.io.*; import com.da.fgbv; public class rter { pub ...
- 编译内核是出现:arch/arm/mm/tlb-v4wbi.S:64:error: too many positional arguments
内核:Linux-3.4.2 编译内核出现arch/arm/mm/tlb-v4wbi.S:64:error: too many positional arguments 交叉工具链太老了,换新一点的. ...
- 问题:MSChart.exe;结果:微软图表控件MsChart使用方法及各种插件下载地址
微软图表控件MsChart使用方法及各种插件下载地址 (2012-08-10 17:32:33) 转载▼ 标签: 图表 控件 下载地址 kernel32 微软 it 分类: C# 昨天在网上看到了微软 ...