首页 > 其他分享 >dijkstra 复杂度证明

dijkstra 复杂度证明

时间:2024-06-16 11:23:38浏览次数:19  
标签:log int text 复杂度 证明 read dijkstra

我们用以下代码为例分析复杂度

#include<bits/stdc++.h>
#include<climits>
#define fir first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,int> PII;
inline int read() {
	int x=0,f=1; char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	return x*f;
}
const int N=1e5+50,M=2e5+50;
int head[N],nxt[M],to[M],W[M],num;
ll dis[N];
void add(int u,int v,int w) {
	++num;nxt[num]=head[u];to[num]=v;W[num]=w;head[u]=num;
}
priority_queue<PII,vector<PII>,greater<PII> >q;
int main() {
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	int n=read(),m=read(),s=read();
	for(int i=1;i<=m;i++) {
		int u=read(),v=read(),w=read();
		add(u,v,w);
	}
	memset(dis,0x3f,sizeof(dis));
	dis[s]=0;
	q.push({dis[s],s});
	while(!q.empty()) {
		int u=q.top().se; 
		if(dis[u]!=q.top().fir) {//写法较奇怪,此处如果dis[u]!=q.top().fir,则dis[u]<q.top().fir,此时{dis[u],u}已经出队列一次,因此此时不需要使用u节点更新
			q.pop();
			continue;
		}q.pop();
		for(int i=head[u];i;i=nxt[i]) {
			int v=to[i];
			if(dis[v]>dis[u]+W[i]) {
				dis[v]=dis[u]+W[i];
				q.push({dis[v],v});
			}
		}
	}
	for(int i=1;i<=n;i++) printf("%lld ",dis[i]);
	return 0;
}

dijkstra 实际复杂度为 \(\text{O}(m\log n)\)

每个点只会被更新一次,每条边只会更新其他点一次,因此复杂度为 \(\text{O}(m\log n^2)=\text{O}(2m\log n)\),所以复杂度为 \(\text{O}(m\log n)\)。

by lyk&yjx

标签:log,int,text,复杂度,证明,read,dijkstra
From: https://www.cnblogs.com/classblog/p/18250320

相关文章

  • 欧几里得算法证明
    求证:gcd(a,b)=gcd(b,a%b)a,b的最大公约数,就是b,a%b的最大公约数。 第一步求证:公约数cd(commondivisor)cd(a,b)=cd(b,a%b) 设a>b则a=kb+r(k是整数,r=a%b)(1)式设d是a,b的公约数,也就是d能被a整除,也能被b整除。(1)式除所d得:a/d=kb/d+r/d   因为a/d和kb/d是整数,所以......
  • 杨氏矩阵和杨辉三角的空间复杂度较小的解题思路
    文章目录题目1杨氏矩阵题目2杨辉三角题目1杨氏矩阵有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。要求:时间复杂度小于O(N);思路:我们可以通过题目要求分析得到:矩阵最右上角的数是一行中最大......
  • Dijkstra 算法的手动分析
    目录Dijkstra算法step0.初始状态step1.第一轮step2.第二轮step3.第三轮step4.第四轮Dijkstra算法以下面有向图为例:graphLRV0((V0))--10-->V1((V1))V0((V0))--5-->V4((V4))V1((V1))--2-->V4((V4))V4((V4))--3-->V1((V1))V1((V1))--1-->V2((V2)......
  • 「笔记」递归算法复杂度分析
    目录写在前面递归算法形式递归树大力求和主定理MasterTheorem典题1234写在最后写在前面可恶的算法分析与设计!!!递归算法形式对于一个输入规模为\(n\)的递归算法,每次均为将整个问题划分为\(a\)个规模为\(\frac{n}{b}\)的子问题,回溯时将所有子问题合并需要\(f(n)\)的时......
  • 最短路算法之:Dijkstra 算法
    最短路系列:Dijkstra算法大家好,我是Weekoder!最短路系列的第二期:Dijkstra他来啦!那么废话不多说,让我们直奔主题吧。Dijkstra算法的用处与floyd算法不同的,Dijkstra算法用于求解单源最短路径。顾名思义,单源最短路径就是起点唯一,终点有多个的最短路算法。Dijkstra的思想是......
  • 区块链共识机制技术一--POW(工作量证明)共识机制
     1.概述POW(ProofofWork,工作量证明)是一种通过消耗计算能力来解决复杂数学问题,从而达到共识的机制。它是最早应用于区块链技术的共识算法,最著名的应用便是比特币网络。 2.工作原理在POW机制中,节点(通常称为矿工)通过竞争性地解决一个复杂的数学难题(即哈希运算)来获得记账权......
  • 如何证明数列收敛
    证明数列收敛的方法主要有以下几种:单调有界定理、子数列收敛性、柯西收敛准则等。下面详细介绍这些方法。方法1:单调有界定理Step1:定义单调有界定理单调有界定理指出:如果一个数列既单调又有界,那么该数列必定收敛。Step2:证明数列单调性和有界性要证明数列{an}\{a_n\}......
  • 裴蜀定理证明
    简单裴蜀定理有\(a\)和\(b\)两数互质,则\(\existsX,Y\in\mathbb{Z}\),使得\(aX+bY=1\).证明:规定集合\(S=\left\{aX+bY|X,Y\in\mathbb{Z}\right\}\)设\(aX_0+bY_0\)为集合\(S\)中的最小正值则对于\(\forallaX+bY\inS\)都可表示为\(aX......
  • 【模板】单源最短路径(Dijkstra + 堆优化)
    #include<iostream>#include<queue>usingnamespacestd;constintinf=2147483647;constintMAXX=2e5+11;intn,m,s,cnt;intdis[MAXX];intto[MAXX],nxt[MAXX],val[MAXX],h[MAXX];boolvis[MAXX];structnode{intv,w;friendbool......
  • 瞎记一些匹配相关定理的证明
    由于公式打不熟练,以下表达上可能会有很多不严谨的地方以及一些笔误。Hall'sTheorem\(S_1,S_2,\cdots,S_m\)存在一组相异代表系(SDR)\(\Leftrightarrow\)\(\forallI\subseteq\{1,2,\dots,m\},|\bigcup_{i\inI}S_i|\geq|I|\)。以二分图为背景就是二分图存在一个完美匹配......