第10周总结博客(校历第12周)最小生成树最短路读资料和做题总结

这周自我批评,自己感觉做的很差,到发这篇博客为止程序设计B的作业还没调出来,概率统计的作业还差2个题没做,程序设计B做的时候图省事,以为之前写过一次了,再写就全写完一起debug,结果全写完后一堆bug,一个接着一个,浪费了一下午时间。做事不能图省事,否则就会变成相反的结果。这周感觉自己想不出东西,写不出来。

下面大部分内容都是读资料的笔记

Prim和Dijkstra算法的复杂度堆优化后都能到O(ElogV)。Kruskal算法本身的复杂度就是O(ElogV),主要耗费在排序上。
Bellman-Ford算法的复杂度是O(VE),复杂度高一些,但能解决负权和负圈问题。
Floyd算法复杂度是O(V^3),写法简单,适用于解决多对多最短路径。
树的问题中用邻接矩阵十分的浪费空间,时间,邻接表空间浪费较小

邻接表是用vector存边(push_back),所以不必担心重边丢失的情况

使用邻接表存储图的话,对于两点之间是否连通的查询,相比邻接矩阵,邻接表处于劣势(因为在邻接表里必须遍历整个当前点的to才能判断是否与另一点连通)

贪心思想:

1:Dijkstra 算法

每次将未加入最短路径的点种找距离出发点最近的点加入,然后用这个点更新所有没有加入的点到起始点的最小距离,每次加入一个点更新一次,直到所有的点都加入数组后结束,就可以统计出这个点到所有点的最短路径。

2:prim 算法

类似于dijkstra算法,区别是是每次选取的点是距离生成树最近的点,更新的时候不再是更新这个点到起始点的最短距离,而是到这个生成输的最短距离。

并查集思想:

kruskal 算法:将原图G中所有E条边按权值从小到大排序。循环:从权值最小的边开始遍历每条边,直至图G_new中所有的节点都在同一个连通分量中。每次从图中未加入树种的边种找到边权最小的看,这两个点的祖先是否是一个,如果是一个说明两个点已经是一个树上的了,不做操作,如果两个点来自不同的树即有不同的祖先,那么就把这两个点所代表的两个树合并起来,最后当所有的点都在一棵树上的时候停止操作,一般用合并次数来控制,即n个点需要合并n-1次,所以最好合并操作写在kruskal函数内部,这样方便统计步数

动态规划思想:

Floyd 算法:

对于每个节点k,都对定点对[i,j]做一次松弛操作

松弛操作:

BellmanFord 算法和SPFA 算法:
设置一个队列,开始将初始点加入这个队列中,如果队列不空的话,取出队列顶端的元素i,用队列顶端的元素对所有的点j进行松弛操作  if(mp[i][j]!=INF&&dis[j]>dis[i]+mp[i][j]) dis[j] = dis[i]+mp[i][j];  如果j点没有在队列中,说明它还有更新其他点的潜力,所以将被更新的j点也加入到队列中去,设置一个计数器,设总点数为n,如果一个点进队的次数大于n则说明存在负环。

各种算法应用的问题:

Dijkstra 算法解决的问题:

非负权图单源最最短路径问题

1.从某一点出发到所有点的最短路径,就是最后更新的dis数组

2.从某一个点到出发到具体某一点的最短路

3.注意Dijkstar 算法不能处理负权边

BellmanFord 算法和SPFA 算法解决的问题:

1.权值有负值得图的单源最短路,并且可以检测到负环,注意,由于B_F算法的复杂度过高而且都可以用SPFA解决,所以我们只学习SPFA算法(一个特例:bellman可以检测并输出负环,单SPFA不能输出负环)

2.最长路

Floyd 算法:

1.全局最短路。2.最长路

prim算法和kruskal 算法:

最小生成树。

对于图的题,一定要根据题意来选取是用链表存储还是用数组存储,选择好的存储方法便于解决问题,也要注意点的编号是从几开始的。

链式前向星:

链式前向星是介于邻接矩阵 和 邻接表之间比较均衡的一种数据结构

本质上是图上所有边以某种特殊方式组成的链表

通过加边方法,可以知道,如何查询一个点连出的边的方法:

        要查询一个点的连出边,我们要先查head,知道这个点最近添加的那条边在哪里(查询结果在这里是j),然后比这条边早一些添加的就是next[j],再早一点的就是next[next[j]],更早一点的是next[next[next[j]]],再早一点的是……,就这样我们一直往时间添加时间更早的边查,直到查到空节点(用来标记链表结束)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值