Dijkstra

本文介绍了Dijkstra算法用于求解无负权边图的最短路径问题,原始版本的时间复杂度为O(n^2+m),并通过使用优先队列优化为O(n+m)logn。详细解释了算法步骤和代码实现.
摘要由CSDN通过智能技术生成

简介

常用于求无负权边图的最短路

介绍:初始时将c初始化为空,将s的距离设置为0,其余顶点的距离设置为无穷大
在每一轮中,将离起点最近的的(dist最小的,不能时无穷的)的还不在c中的点加入c,并且用这个点连出去的边通过松弛操作尝试更新其他点的dist

代码实现
时间复杂度o(n^2+m)

struct Node{
	int y,v;//y表示连到哪里,v表示边权
	Node(int _y,int  _v){y= _y; v= _v};
};
vector<Node> edge[N+1];
int n,m,dist[N+1];//n顶点,m边,dist[]距离
bool b[N+1];//当前这个点有没有在c中
int Dijkstra(int s,int t){
	//找s到t的最短路
	memset(b,false,sizeof());
	memset(dist,127,sizeof(dist));//将c设置为空,将s的距离设置为0,其余顶点的距离设置为无穷大
	dist[s]=0;//s的距离设置为0
	for(;;){
		int x = -1;
		for(int i = 1; i <=n; i++){
			if(!b[i] && dist[i] <1 <<30)
				if(x == -1 || dist[i] < dist[x])
					x=i;
		if(x == t || x== -1)
			break;
		b[x] = true;
		for(auto i : edge[x])
			dist[i.y] = min (dist[i.y] , dist[x] +i.v);
		}
	}
	return dist[t];
}

算法优化
时间复杂度(n+m)logn

struct Node{
 int y,v;
 Node{int _y, int _v}{y = _y;v = _v};
};
set<pair<int,int>>q;
vector<Node> edge[N+1];
int n,m,dist[N+1];

itn Dijkstra(int s,int t){
	memset(dist,127,sizeof(dist));
	dist[s] = 0;q.clear();
	for(int i =1; i <= n; i++)
		q.insert(make_pair(dist[i],i));
	for(;!q.empty();){
		int x = q.begin()->second;
		q.erase(q.begin());
		if(x == t || dist[x] > 1<<30)
			break;
		for(auto i :edge[x]){
			if(dist[x] + i.v<dist[i.y]){
			q.erase(make_pair(dist[i.y],i.y));
			dist[i.y] = dist[x] +i.v;
			q.insert(make_pair(dist[i.y],i.y));
			}
		}
	}
	return dist[t];
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值