纪中14日听课小结 图论 最短路 二分图 差分约束

纪中14日听课小结

0x00 绪言

还不错吧……

起码这个还能听懂一些……

0x01 二分图

定义:将所有点分为两个集合,且同一个集合内的点没有直接的边

可以有环。但是可以证明只有偶环,没有奇环。

奇环:由奇数个点构成的环

匈牙利算法

基于贪心,框架DFS递归

可求二分图是否为完美匹配,或者二分图的最大匹配。

 

例题

BZOJ4443 小凸玩矩阵

有一个n*m的矩阵,要取出n个数,且每行每列至多取一个。

问取出的第k大数最大是多少。

Algorithm

将每一行/列看做是一个点

分别放置两个集合中

求原图的最大匹配

最后二分mid查找kmin

(我也不知道我说的对不对……还是听听大佬的吧!)

 

#1楼 2019-08-14 18:01 Pedesis

小凸玩矩阵 是先二分答案 再将需要用的点跑二分图判断该答案是否成立

0x02 SPFA*

* SPFA是Shortest Path Fast Algorithm的缩写

作用:计算单源最短路径长度

架构:BFS广搜变形+队列优化

时间复杂度:O(VE)~O(E)

玄学优化:SLF:若队尾的SSSP<队首的SSSP,则将队首队尾元素交换

0x03 Johnson

几乎没什么人用

在Dijkstra(迪杰斯特拉)的基础上构建

多了每一个点的权重h

在图外新建一个点

且这个点到所有点的的距离皆为0

dist[u,v]=dist[u,v]+h(u)-h(v)

可以处理负权边

0x04 Prim

用来计算最小生成树(MST,Minimum Spanning Tree)

基于贪心

用邻接表存储边(结构体更好)

  1. 从任意一点开始
  2. 扫描MST所有出边,选用离当前MST距离(边权)最小的点加入MST(即优先用边权小的边)
  3. 标记此点(用bool数组)

暴力O(|v|2

堆优化后O(|v|*log(|v|))

0x05 kruskal

克鲁斯卡尔

基于贪心

同Prim,用来计算最小生成树(MST,Minimum Spanning Tree)

用并查集来查看是否形成环

  1. 使用邻接表储存两点之间的边权
  2. 将所有边按照边权进行排序(从小到大)
  3. 每次选取最小边权的两点,查询这两点是否在同一集合内
  4. 若不在,则将这两点连接,并使用并查集merge(合并)这两点
  5. 重复3,4直到连了n-1条边(或只有一个点的祖先是自己),即所有点都在同一个连通分量中

平均时间复杂度为O(|E|log|E|),其中E和V分别是图的边集和点集。(百度百科)

posted @ 2019-08-14 16:39  Vanilla_chan  阅读(337)  评论(2编辑  收藏  举报