洛谷 P4779 --【模板】单源最短路径(标准版) 题解 By Kimi_Kai

一、题意

首先呢,阐述一下,这是一道最短路模板题,其实看题也看得出来… …,所以呢,我们先得搞清楚什么是最短路

这道题呢,我们用的是dijkstra(俗称低级科斯拉)
如有未搞懂dijkstra的童鞋,可以先看看这片题解

dijkstra详解

既然是用dijkstra,那就得先想到堆优化(上面链接中也说了)。但是呢,最短路径这类问题,堆优化可以用一个优先队列来代替,即priority_queue (头文件要用 #include )

给出这道题几个重点部分:
一、重载

重载(即 friend bool operator)可将一个符号改成自己需要的作用,但只适用于一定范围中,如在结构体中的重载,就只能在使用到结构体的时候用,且没有原来的作用。而在其他部分还是原来的作用

struct node //结构体名称
{
   
	int a,b; //两个比较变量
	friend bool operator < (const node &x,const node &y) //定义
	{
   
		return x.a>y.a; //重载
	}
}; //注意,这里要在优先队列中用到,所以不需要有数组
二、添边

最短路径属于图论,而图论不可缺失的就是添边,这时,我们需要用到添边函数addedge了

int to[maxn],val[maxn],head[maxn],ne[maxn],cnt; //to代表从该点到哪个点,val代表边权,ne代表点在数组里的编号,head代表上一个点在数组里的编号,cnt代表现在运行到第几条边了
void edge(int u,int v,int w)//
{
   
	to[++cnt]=v; //添边
	val[cnt]=w; //存边权
	ne[cnt]=head[u]; //存点编号
	head[u]=cnt; //下一个	
}
三、松弛

松弛是用每一个还没查询过的点,去看能不能更新最短路,且每个点只能松弛一次

void dijkstra(s) //命名
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值