无向图------------>(有权)加权图;
计算单源点到任意点的最短路长:
分类:
1.各个点到邻近点距离都相同:纯BFS 或 迪克斯特拉
2.存在某一点到临近点距离不同:
一、迪克斯特拉(BFS+贪心+张弛, 优化方法:堆排序:O(E+nlog2 n))
二、SPFA(没有张弛操作,时间复杂度:O(VE))
##################################################
迪克斯特拉不适用的情况:不适用于含有负权边的加权图------->导致死循环(无限张弛)
BFS不适用的情况:加权图的某点到临近点距离不相同。(试试优先队列)
优先队列:
头文件:<queue>
定义优先队列:
priority_queue<T> name;
基本操作:
name.empty();
name.top();//头元素
name.push();
name.pop();
优先队列常常与结构体和小于号重载相关:
struct node
{
int a,..;
//举例:比如a小的排在前面
bool operator < (const node & n) const
{
if(a>=n.a) return true;
else return false;
}
};
重载小于号的时候,要:
分类(大于,小于,等于) ,要有return true / / return false;
重载的时候,格式:
bool operator < (const node & n) const
{
if(..>=..) return ...;//或者用(....<=) // (...<...) // (...>...)
else if(...<...) return ....;
}
按照重载的目的分类:
1.从小到大排序:
bool operator < (const node & n) const
{
if(a<=n.a) return true;
else if(a>n.a) return false;
}
2.从大到小排序:
bool operator < (const node & n)const
{
if(a>=n.a) return true;
else if(a<n.a) return false;
}
###################################
优先队列的特点:自动排序
除此之外,还有集合:set 可以自动排序;
重载小于号的操作也与结构体有关,bool operator < 和 优先队列 相似。set 定义 也可以 用 结构体。