Dijkstra算法

\(Dijkstra\ algorithm\)

\(Principle\)

以点为研究对象的贪心策略,和\(Prim\)类似。

\(Implementation\ step\)

  1. 将起点标记;
  2. 找条连接被标记的点集合中一点没有被标记的点集合中一点最短的边;
  3. 将该边连接的没有被标记的点 加入被标记的点
  4. 将该新加入的被标记的点它的所有邻接点进行松弛操作;
  5. 返回第二步,直到\(n\)个点都被标记为止。
  • 时间复杂度:\(O(n^2)\)

\(Template\ code\)

cpp 复制代码
void dijkstra()
{
	memset(dis,0x3f,sizeof dis);
	dis[s]=0;
	for(int i=1;i<=n;i++)
	{
		int x=1,mini=INT_MAX;
		for(int j=1;j<=n;j++)
			if(mini>dis[j]&&!vis[j])
				x=j,mini=dis[x];
		vis[x]=true;
		for(auto y:nbr[x])
			if(dis[x]+y.w<dis[y.x])
				dis[y.x]=dis[x]+y.w;
	}
	return;
}

\(Optimize\)

  • \(dis[i]\)会随着松地操作更新,因此是动态求最小值,考虑优先队列优化:

    • 用优先队列维护没有标记的点,且是小根堆
  • 时间复杂度:\(O(m\log n)\)

\(Code\)

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,s,dis[N];
bool vis[N];
struct node{
	int x,w;
	bool operator<(node y) const
	{
		return w>y.w;
	}
};
vector<node>nbr[N];
void dijkstra()
{
	memset(dis,0x3f,sizeof dis);
	priority_queue<node>pq;
	dis[s]=0;
	pq.push({s,0});
	while(!pq.empty())
	{
		node now=pq.top();
		int x=now.x;
		pq.pop();
		if(vis[x])
			continue;
		vis[x]=true;
		for(auto y:nbr[x])
			if(dis[x]+y.w<dis[y.x])
			{
				dis[y.x]=dis[x]+y.w;
				pq.push({y.x,dis[y.x]});
			}
	}
	return;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		nbr[u].push_back({v,w});
	}
	dijkstra();
	for(int i=1;i<=n;i++)
		if(dis[i]==dis[0])
			cout<<INT_MAX<<' ';
		else
			cout<<dis[i]<<' ';
	return 0;
}
  • 这份代码里面使用了重载运算符(Overload operator)
    • 重载运算符:
      • \(Over\):覆盖
      • \(Load\):加载
      • \(Overload\):重载
      • \(Operator\):运算符。
    • 重载运算符是指将运算符(加减乘除等)修改为自定义的含义

\(Dijkstra's\ relationship\ with\ BFS\)

  • \(BFS\) 是边权相同的 \(Dijkstra\)

\(Matters\ needing\ attention\)

  1. 不能应用于有负边权的图;

  2. 不能跑最长路;

  3. 注意松弛操作溢出

    cpp 复制代码
    if(dis[x]<dis[y]-w)
  4. 多次调用\(Dijkstra\)要重置\(vis[]\)和\(dis[]\)

相关推荐
电鱼智能的电小鱼1 小时前
基于电鱼 AI 工控机的智慧工地视频智能分析方案——边缘端AI检测,实现无人值守下的实时安全预警
网络·人工智能·嵌入式硬件·算法·安全·音视频
孫治AllenSun1 小时前
【算法】图相关算法和递归
windows·python·算法
格图素书2 小时前
数学建模算法案例精讲500篇-【数学建模】DBSCAN聚类算法
算法·数据挖掘·聚类
DashVector3 小时前
向量检索服务 DashVector产品计费
数据库·数据仓库·人工智能·算法·向量检索
AI纪元故事会3 小时前
【计算机视觉目标检测算法对比:R-CNN、YOLO与SSD全面解析】
人工智能·算法·目标检测·计算机视觉
夏鹏今天学习了吗3 小时前
【LeetCode热题100(59/100)】分割回文串
算法·leetcode·深度优先
卡提西亚3 小时前
C++笔记-10-循环语句
c++·笔记·算法
还是码字踏实3 小时前
基础数据结构之数组的双指针技巧之对撞指针(两端向中间):三数之和(LeetCode 15 中等题)
数据结构·算法·leetcode·双指针·对撞指针
Coovally AI模型快速验证6 小时前
当视觉语言模型接收到相互矛盾的信息时,它会相信哪个信号?
人工智能·深度学习·算法·机器学习·目标跟踪·语言模型
电院工程师6 小时前
SIMON64/128算法Verilog流水线实现(附Python实现)
python·嵌入式硬件·算法·密码学