图论:最短路-Dijkstra
Dijkstra+堆优化具有稳定的时间复杂度,在一些数据范围要求比较严格(准确来说是图比较苛刻)的时候能够保证稳定的时间复杂度
但是Dijkstra不能够解决负边权的问题,所以在使用的时候一定要仔细读题
如果题目说了边权非负,首选Dijkstra算法, 如果图不是一些特殊的数据,可以尝试SPFA算法,毕竟在稀疏图面前,SPFA有着绝对的优势
Dijkstra和Prim很相似,它们的区别主要是d的含义,前者是到s的临时最短距离,后者是到树的临时最短距离,相同点是,每次找d最小的更新其它点的距离
然后,我们开始介绍用法:
int s,n,m,cnt;
int g[maxn],d[maxn];
struct Edge{int u,t,w,next;}e[maxm];
struct HeapNode{int d,u;bool operator <(const HeapNode& x) const{return d>x.d;}};
priority_queue<HeapNode> q;
在Bellman-Ford中相同的字眼我们不介绍,意义一致
HeapNode结构体和优先队列用来实现一个最小堆,堆元素是点,记录了节点号和距离值
void dijkstra(int s)
{
for(int i=;i<=n;i++) d[i]=INF;
d[s]=;
HeapNode p;
p.d=;p.u=s;q.push(p);
while(!q.empty())
{
HeapNode x=q.top(); q.pop();
int u=x.u;
if(x.d!=d[u]) continue;
for(int tmp=g[u];tmp;tmp=e[tmp].next)
if(d[e[tmp].t]>d[u]+e[tmp].w)
{
d[e[tmp].t]=d[u]+e[tmp].w;
p.d=d[e[tmp].t];p.u=e[tmp].t;q.push(p);
}
}
}
如果你能够写明白邻接矩阵的Dijkstra算法,这里具有完全一致的意义,只不过用最小堆来找距离当前点集距离最小的点,把一遍遍历变成了Log级别的
然后这里的Dijkstra算法如果用邻接矩阵的话,就是被打回原形了,所以一定要用邻接表或者邻接数组来存储
下面给出完整实现:
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int INF=0x7fffffff;
const int maxn=;
const int maxm=;
int s,n,m,cnt;
int g[maxn],d[maxn];
struct Edge{int u,t,w,next;}e[maxm];
struct HeapNode{int d,u;bool operator <(const HeapNode& x) const{return d>x.d;}};
priority_queue<HeapNode> q;
void addedge(int x,int y,int z)
{
cnt++;e[cnt].u=x;e[cnt].t=y;e[cnt].w=z;
e[cnt].next=g[x];g[x]=cnt;
}
void dijkstra(int s)
{
for(int i=;i<=n;i++) d[i]=INF;
d[s]=;
HeapNode p;
p.d=;p.u=s;q.push(p);
while(!q.empty())
{
HeapNode x=q.top(); q.pop();
int u=x.u;
if(x.d!=d[u]) continue;
for(int tmp=g[u];tmp;tmp=e[tmp].next)
if(d[e[tmp].t]>d[u]+e[tmp].w)
{
d[e[tmp].t]=d[u]+e[tmp].w;
p.d=d[e[tmp].t];p.u=e[tmp].t;q.push(p);
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
int x,y,z;
for(int i=;i<=m;i++) {scanf("%d%d%d",&x,&y,&z);addedge(x,y,z);}
dijkstra(s);
for(int i=;i<=n;i++) {printf("%d ",d[i]);}
return ;
}
图论:最短路-Dijkstra的更多相关文章
- 图论--最短路--dijkstra(含路径输出)模板
#include<iostream> #include<stack> #include<queue> #include<cstring> #includ ...
- 图论最短路——dijkstra
下午直接开始dijkstra的堆优化,很简单的这里把书上的原理说一下吧,小心和prim最小生成树的堆优化迷,Dijkstra算法基于贪心思想,它只适用于所有边都是非负数的图.当变长z都是非负数的时候, ...
- 图论--最短路-- Dijkstra模板(目前见到的最好用的)
之前的我那个板子,老是卡内存,不知道为什么,我看别人过的那个题都是结构体,我就开始对自己板子做了修改,然后他奶奶的就过了,而且速度也提高了,内存也小了.(自从用了这个板子,隔壁小孩馋哭了)也不知道为啥 ...
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...
- 图论(最短路&最小生成树)
图论 图的定义与概念 图的分类 图,根据点数和边数可分为三种:完全图,稠密图与稀疏图. 完全图,即\(m=n^2\)的图\((m\)为边数,\(n\)为点数\()\).如: 1 1 0 1 2 1 1 ...
- 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树)
layout: post title: 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树) author: "luowentaoaa" ca ...
- 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)
layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...
- 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)
layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...
- hdu 2544 最短路 Dijkstra
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间, ...
- 单源最短路dijkstra算法&&优化史
一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...
随机推荐
- 自测之Lesson15:TCP&UDP网络编程
题目:编写一个TCP通信的程序. 实现代码: #include <stdio.h> #include <sys/socket.h> #include <unistd.h& ...
- 词频统计 SPEC 20170914 1 1 1 1 1
功能1 小文件输入,为表明程序能跑,结果真实而不是迫害老五,请他亲自键盘在控制台下输入命令. #include<stdio.h> #include<string.h> #inc ...
- .mat转成.npy文件+Python(Pytorch)压缩裁剪图片
需求:现有数据文件V1.mat,里面包含多个数据集,现需将里面的images数据集提取出来,然后进行压缩裁剪成指定大小 V1.mat数据集目录: 1.从mat文件中提取数据(使用Python) V1. ...
- PAT L2-028 秀恩爱分得快
https://pintia.cn/problem-sets/994805046380707840/problems/994805054698012672 古人云:秀恩爱,分得快. 互联网上每天都有大 ...
- [剑指Offer] 48.不用加减乘除做加法
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2.第二步:计算进 ...
- [Leetcode] 3.Longest Substring Without Repeating Characters(unordered_map)
通过把未访问的结点放到unordered_map中来判断是否重复,代码如下: class Solution { public: int lengthOfLongestSubstring(string ...
- Delphi开发的一些技巧
[Delphi]Delphi开发的一些技巧 一.提高查询效率先进行准备查询操作: CustomerQuery.Close; if not (CustomerQuery.Prepared) then - ...
- 窗口中各模块的切换效果,使用jquery实现
用到了两个js库,请自行下载,用到的背景图片可任意图片都可以,主要是看效果 <!DOCTYPE html> <html> <head> <script src ...
- 【python】使用枚举类
当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单,缺点是类型是int,并且仍 ...
- 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay
[bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ...