一、题意
首先呢,阐述一下,这是一道最短路模板题,其实看题也看得出来… …,所以呢,我们先得搞清楚什么是最短路
这道题呢,我们用的是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) //命名