学习目标:
基本掌握几种重要的图论算法知识,例如Dijkstra、Floyed算法
图论算法知识是为了在实现送货机器人的路径规划时使用
学习内容:
1、 Dijkstra单源非负边权最短路算法
Dijkstra 算法,是由荷兰计算机科学家 Edsger Wybe Dijkstra 在1956年发现的算法,戴克斯特拉算法使用类似广度优先搜索的方法解决赋权图的单源最短路径问题。
该算法通常用来解决从源结点到其他结点的最短路径,产生一个最短路径树,算法复杂度为O(n^2)
该算法思维:从源结点开始,不断扩充已经找到最短路径的顶点集合S,对于不是在该集合的顶点,找到一个到该集合的距离最短的顶点加入到该集合中并更新它的最短路径长度,依次类推直到所有顶点都进入该集合。(该算法对于连通图而言,当然,它也可以检测一个图的连通性)
代码实现:
void dijk(int s)
{
//初始化
memset(path,-1,sizeof(path));
/*INF使用0x3f3f3f3f的好处:
* 1:满足无穷大加一个有穷的数依然是无穷大(在DijKstra算法松弛操作中避免了溢出而出现负数)
* 2:满足无穷大加无穷大依然是无穷大(两个0x3f3f3f3f相加并未溢出)
* 3:初始化时,由于每一个字节为0x3f,所以只需要memset(buf,0x3f,sizeof(buf))即可
*/
memset(dis,0x3f,sizeof(dis)); //初始化为无穷大
memset(vis,0,sizeof(vis));
dis[s] = 0; //自身到自身的距离为0
while(1