Always ke|

Creeper_l

园龄:1年4个月粉丝:10关注:13

Dijkstra学习笔记

模板题:P4779

Dijkstra算法

\(Dijstra\)算法是一种求解非负权图上单源最短路径的算法,这种算法不可以解决负环问题。

做法

首先要定义松弛操作。对于一条边(\(u,v\)),松弛操作对应下面的运算:\(dis_{v}\) = \(dis_{u}\) + \(w_{u,v}\)

对于\(Dijkstra\),我们可以将结点分成两个集合:已确定最短路长度的点集(记为\(S\)集合)的和未确定最短路长度的点集(记为$ T\(集合)。一开始所有的点都属于\)T\(集合。设源点为\)s\(,初始化\)dis_{s} =0\(,其他\)dis\(为正无穷。每一次从 \)T\(集合中选最短路最小的加入\)S\(集合中,并对其出边进行松弛操作,重复操作直到\)T$集合为空为止。

证明

关于证明,可以用反证法,但我也不会证。主要是证明在执行操作时,取出的结点\(u\)最短路均已经被确定,即满足\(D(u)\) = \(dis(u)\)。大概感性理解一下,因为每次选出的点都是\(T\)集合中最短路最小的点。具体证明可以参考oiwiki

时间复杂度

\(Dijksra\)有三种实现方法,一种是直接每次暴力寻找最短路最小的点,时间复杂度\(O(n^{2} + m)\),这种方法时间复杂度很高,不常用。第二种是用优先队列优化,这种方法是最普遍的。因为每个点可能被修改多次,所以优先队列里的数是\(O(m)\)的,总复杂度\(O(mlogm)\),可以接受。第三种是用线段树优化,支持单点修改和全局查询,时间复杂度\(O(mlogn)\),但是码量比较大。

Code

这里是用优先队列写的

#include<bits/stdc++.h>
using namespace std;
typedef pair <int,int> pii;
#define inf 0x3f3f3f3f
const int MAXN = 1e5 + 10;
int head[MAXN],cnt,n,m,x,y,z,dis[MAXN],s;
bool vis[MAXN];
struct Node
{
	int u,v,w,nxt;
}e[MAXN << 1];
void add(int u,int v,int w){e[++cnt] = {u,v,w,head[u]};head[u] = cnt;}
priority_queue <pii,vector <pii>,greater <pii> > q;
void dijkstra(int s,int n)
{
	memset(dis,inf,sizeof dis);
	dis[s] = 0;
	q.push(make_pair(n,s));
	while(!q.empty())
	{
		int u = q.top().second
		;q.pop();
		if(vis[u] == true) continue;
		vis[u] = true;
		for(int i = head[u]; ~ i;i = e[i].nxt)
		{
			int now = e[i].v;
			if(dis[u] + e[i].w < dis[now]) 
			{
				dis[now] = dis[u] + e[i].w;
				q.push(make_pair(dis[now],now));
			} 
		}
	}
}
int main()
{
	memset(head,-1,sizeof head);
	cin >> n >> m >> s;
	for(int i = 1;i <= m;i++) cin >> x >> y >> z,add(x,y,z);
	dijkstra(s,0);
	for(int i = 1;i <= n;i++) cout << dis[i] << " ";
	return 0;
}

本文作者:Creeper_l

本文链接:https://www.cnblogs.com/Creeperl/p/17913347.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Creeper_l  阅读(15)  评论(0编辑  收藏  举报
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
  3. 3 True love tired
  4. 4 一笑江湖 (DJ弹鼓版) 闻人听書_
  5. 5 最好的安排 曲婉婷
  6. 6 星星在唱歌 司南
  7. 7 山川 李荣浩
  8. 8 On My Way Alan Walker
  9. 9 百战成诗 王者荣耀·100英雄官方群像献礼歌
  10. 10 雪 Distance Capper / 罗言
  11. 11 Edamame bbno$ / Rich Brian
  12. 12 半生雪 七叔-叶泽浩
  13. 13 Catch My Breath Kelly Clarkson
  14. 14 Love Is Gone SLANDER / Dylan Matthew
  15. 15 Endless Summer Alan Walker / Zak Abel
  16. 16 悬溺 葛东琪
  17. 17 风吹丹顶鹤 葛东琪
  18. 18 Normal No More TYSM
  19. 19 哪里都是你 队长
  20. 20 Stronger Kelly Clarkson
  21. 21 廖俊涛
  22. 22 消愁 毛不易
  23. 23 The Runner Yubik
  24. 24 踏山河 七叔-叶泽浩
  25. 25 Waiting For Love Avicii
  26. 26 在你的身边 盛哲
  27. 27 Dream It Possible Delacey
  28. 28 凄美地 郭顶
  29. 29 满天星辰不及你 ycc
  30. 30 侧脸 于果
  31. 31 阿拉斯加海湾 蓝心羽
  32. 32 虞兮叹 闻人听書_
  33. 33 离别开出花 就是南方凯
  34. 34 盗墓笔记·十年人间 李常超 (Lao乾妈)
侧脸 - 于果
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起