Dijkstra----图论最短路算法/Dijkstra堆/优先队列优化

本文详细介绍了Dijkstra单源最短路径算法,从基础的邻接矩阵实现到堆优化的邻接表实现,探讨了算法的优化过程,包括如何处理优先队列中的重复元素以确保正确性。
摘要由CSDN通过智能技术生成

Dijkstra是图论最常用的最短路算法,floyed复杂度是O(n^3),显然是超时的,Bellman-Ford也是超时问题,SPFA更不用说,已经死了 菊花图给你拿捏的死死的

所以万众瞩目的Dijkstra单源最短路径你怎么能不会呢,我也不会

先从未优化的dij开始讲起

大概的思路就是讲=将图上的点分为两类,一类是找到最短路的节点,一类是未找到最短路的节点(建议用一个bool数组就行,不同并查集)

那么讲讲准备,首先未优化的dij是通过;邻接矩阵存储的图,所以我们需要一个数组A[][]表示i和j直接连接的距离,一个path数组记录i的前驱且是最短路径上的前驱)

准备的代码如下

const int inf=999999;
const int maxn=101;
int a[maxn][maxn],d[maxn],path[maxn];//a[i][j]的距离 (直接链接) d[i](i到原点的最短距离) path[i](i的前驱并且是最短路的前驱)
bool f[maxn];//分类A,B两类
int n,m,start;

main函数其实是存图的过程,简单讲下

对于n个点m条边的图,操作如下
int main(){
   
	cin>>n>>m>>start;
	int x,y,w;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++){
   
		if(j==i)a[i][j]=0;//自己到自己的距离为0
		else a[i][j]=inf;//初始化
	}
	for(int i=1;i<=m;i++){
   
		cin>>x>>y>>w;
		a[x][y]=w;//无向图
		a[y][x]=w;//无向图
	}
	Dijkstra(start);
	for(int i=1;i<=n;i++){
   
			bfs(i);//为了倒序输出
			cout<<d[i]<<endl;
	}
	return 0;
}

接下来就是核心—dij了,先初始化然后找起点,跑一遍for更新(d[k]+a[k][j]<d[j])代码如下

void Dijkstra(int s){
   
	for(int i=1;i<=n;i++){
    //初始化
		d[i]=inf;
		f[i]=false;
	}
	d[s]=0;
	for(int i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值