首页 > 其他分享 >Dijkstra

Dijkstra

时间:2023-08-12 22:45:20浏览次数:27  
标签:标记 int 复杂度 MN Dijkstra dis

给定一张 \(n\) 个点、\(m\) 条边的有向图,求 \(1\) 号点到每个点的最短路径长度。


我们用 \(dis_{i}\) 表示从点 \(1\) 到点 \(i\) 的最短距离。

  • 初始化 \(dis_{1}\) 为 \(0\),其余为无穷大

  • 找出点 \(i\) ,满足 \(dis_{i}\) 是未标记节点中 \(dis\) 值最小的,并标记点 \(i\)

  • 遍历节点 \(i\) 的出边,有点 \(i\) 到点 \(j\),权值为 \(k\)。
    若 \(dis_{j}>dis_{i}+k\),更新 \(dis_{j}\) 为 \(dis_{i}+k\)

  • 重复第二第三步,标记到不能标记

如果起点不是 \(1\) ,就按需求调整起始点。

对于第二步,我们可以暴力循环但显然时间复杂度高,因此我们选用堆来存 \(dis\) 的值,以此优化,堆优化后的 Dijkstra 时间复杂度是 \(O(n\log n)\),没有优化的是 \(O(n^2)\)。

不可以搞负权

Dijkstra粗浅的证明

因为边权都为非负数,所以选取的 \(dis\) 最小的结点不可能被其他点更新,故每次选出来的点 \(i\) 对应的 \(dis_{i}\) 一定是从起点到 \(i\) 的最短距离。

int n, m, u, v, w;
vector<int>to[MN], eg[MN];
int dis[MN]; bool vis[MN];
priority_queue<pair<int,int> >q;
void dij() {
	for(int i=1; i<=n; ++i) dis[i]=INF, vis[i]=0;
	dis[1]=0; q.push(make_pair(0,1)); 
	while(q.size()) {
		int x=q.top().second; q.pop();
		if(vis[x]) continue;
		vis[x]=true;
		for(int i=0; i<to[x].size(); ++i) {
			int y=to[x][i], z=eg[x][i];
			if(dis[y]>dis[x]+z) { 
				dis[y]=dis[x]+z;
				q.push(make_pair(-dis[y],y));
			}
		} 
	}
}

标签:标记,int,复杂度,MN,Dijkstra,dis
From: https://www.cnblogs.com/chelsyqwq/p/17625714.html

相关文章

  • 考研数据结构——每日一题[Dijkstra求最短路]
    849.Dijkstra求最短路I给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出−1。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点......
  • AcWing 850. Dijkstra求最短路 II
    题目给定一个$n$个点$m$条边的有向图,图中可能存在重边和自环,所有边权均为非负值。请你求出$1$号点到$n$号点的最短距离,如果无法从$1$号点走到$n$号点,则输出$−1$。输入格式第一行包含整数$n$和$m$。接下来$m$行每行包含三个整数$x,y,z$,表示存在一条从点$......
  • Acwing 849. Dijkstra求最短路 I
    题目给定一个$n$个点$m$条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出$1$号点到$n$号点的最短距离,如果无法从$1$号点走到$n$号点,则输出$−1$。输入格式第一行包含整数$n$和$m$。接下来$m$行每行包含三个整数$x,y,z$,表示存在一条从点$x$......
  • Dijkstra最短路径算法及其优化
    Dijkstra最短路径算法及其优化图示过程可以参考图文详解Dijkstra最短路径算法(freecodecamp.org)直接给出Java版本的普通实现方式:/***最普通的实现形式,时间复杂度是O(n2),空间复杂度是O(n)*@paramweight*@paramstart*@return*/publicstaticint[]getDij......
  • 最短路径Dijkstra算法--求距离和路径
    1、题目描述求单条路线2、AC代码#include<iostream>#include<cstring>#include<bits/stdc++.h>#defineinf1000000000usingnamespacestd;typedeflonglongll;constintN=105;intn,m,s,t;structnode{ intv;//边终点 intw;//边权 node(intx,inty)......
  • dijkstra + 单调栈优化
    打Div.3发现两个最短路板子题一个用的SPFA一个用的邻接矩阵,赶紧补个。#include<iostream>#include<queue>#defineMAXN20010usingnamespacestd;constintinf=2147483647;intn,m,s,t,cnt;intdis[MAXN],h[MAXN],to[MAXN],val[MAXN],nxt[MAXN];boolvis[MAXN]......
  • 8/4 dijkstra
    最短路径(迪科斯特算法模板)#include<bits/stdc++.h>usingnamespacestd;intn,m,s;boolvis[10005];intINF=0x3f3f3f3f;intd[10005];structnode{intv,w;};vector<node>G[1005];structhn{intu,dist;hn(int_u,int_dist){u=_u......
  • dijkstra算法
    【USACO】热浪#include<bits/stdc++.h>usingnamespacestd;structnode{ intu,dist; node(int_u,int_dist) { u=_u; dist=_dist; }};structnode2{ intv,w; node2(int_v,int_w) { v=_v; w=_w; }};structcmp{ booloperator()(nodea,nod......
  • 浅谈 dijkstra 与其它文章并没有谈到的一些问题
    讲一个小故逝今天做到了一道很典的题目P1875,我发现我其实并不太会,然后在我看完了题解剽题解的屑以后,我发现我对dijkstra的理解仅仅停留在它的过程,而没有深入挖掘dijkstra的正确性以及它的本质等等。所以这篇文章会从另一个角度来看看dijkstra。也许这是dijkstra的本质吧,还......
  • Dijkstra 算法——求解最短路径问题
    Dijkstra算法——求解最短路径问题  迪杰斯特拉算法(Dijkstra'salgorithm)是一种用于解决单源最短路径问题的贪心算法。它可以找到从一个起始顶点到其他所有顶点的最短路径,并且适用于边的权重非负的图。算法步骤如下:创建一个数组dist,用于保存起始顶点到其他顶点的最短距离......