dijkstra的邻接表实现和堆优化

本文介绍了一种使用堆优化和邻接表实现的Dijkstra算法,适用于边数大于等于1e5的情况。通过重载运算符使优先队列能够按照边权大小弹出节点,并利用节点结构体和邻接表来存储图结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间复杂度O(eloge),在n的数量级>=1e5时必须采用这种堆优化+邻接表方式 。

int vis[MAXN];
int pre[MAXN];//前驱节点
int dis[MAXN];//距离源的长度
struct node{
	int vex,w;//节点和距离源点的最优距离
	friend bool operator < (node a,node b){//重载运算符,使其按边长从小到大弹出
		return a.w>b.w;//这里也可以写做dis[a.vex]>dis[b.vex];
	}
	node(){
		this->vex=0; this->w=0;
	}
	node(int v,int w){
		this->vex=v; this->w=w;
	}
};
priority_queue<node>que;
vector<node>vec[MAXN];
void dijkstra(){
	memset(vis,0,sizeof(vis));
	memset(dis,inf,sizeof(dis));
	dis[src]=0; pre[src]=src;//源的距离为0,前驱节点为自己
    que.push(node(1,0));
	while(!que.empty()){
		node now=que.top();
		que.pop(); int tmpv=now.vex;
		if(visit[tmpv]) continue;
		visit[tmpv]=1;
		for(int i=0;i<vec[tmpv].size();i++){
			int nxtv=vec[tmpv][i].vex;
			if(!visit[nxtv]&&dis[tmpv]+vec[tmpv][i].w<dis[nxtv]){//如果可以松弛该边
				dis[nxtv]=dis[tmpv]+vec[tmp][i].w;
				pre[nxtv]=tmpv;
				que.push(node(nxtv,dis[nxtv]));
			}
		}
	}	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值