【模板题】【图】最短路径 经典例题 ——dijkstra+priority_queue

本文通过两个经典例题讲解如何使用Dijkstra算法结合优先队列解决最短路径问题。第一个例子是PID341 / 星门跳跃,通过在添加节点到队列前进行距离判断优化了算法效率。第二个例子是726:ROADS,涉及路径的两个属性——距离和花费,需注意优先队列的排序方式以及无需进行距离判断。

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

【经典模板】:PID341 / 星门跳跃

题目大意:从1到N有M条边,每条边距离z,求最短路

思路:dijkstra+priority_queue。本道题由于数据非常大,时间要求严,不能全部往队列里丢数据,可以在之前加个判断,本次距离是否减小,减小则往队里扔。此外由于优先队列每次都是选取最小距离,则此距离固定,则代表已访问,标记点下次访问到此点直接跳过。

注意:

1、加判断if(visit[u])和if(D[v]==-1 || D[v]>D[u]+cost);

#include<cstdio> 
#include<queue>
#include<vector>
#include<string.h>
#define MAX 300001
using namespace std;
struct node
{
    int v,c;//u->v cost=c;
    node (){}
    node(int x,int y){v=x;c=y;}
	bool operator < (const node &A) const
	{
		if (c==A.c)
			return v>A.v;
		else return c>A.c;
	}
};
vector<node>g[MAX];
bool visit[MAX];
int D[MAX];
int n,m;
void Dijkstra()
{
	priority_queue<node>Q;
	int i,u,v,cost;
	node p;
	memset(visit,0,sizeof(visit));
	memset(D,-1,sizeof(D));
	D[1]=0;
	Q.push(node(1,D[1]));
	while(!Q.empty())
	{
		p=Q.top();Q.pop();
		u=p
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值