day7:图论(下)
又是自闭的一天,讲的都是几乎对于我来说是全新的,唯一一个二分图最大匹配匈牙利算法在暑假做题的时候偶然遇到了,然后自学了一下,其余…
(一):
首先讲了昨天还剩下一点没讲完的最短路径:多源点问题 Floyd算法
就是用了动态规划的思想,代码简单,对于我这种记模板的小白来说是最好用不过了,直接三重for循环不断更新每两个点之间的最短路径,显然总的时间复杂度O(n^3)
(二):
这个一讲完就开始我自闭的一上午了
直接上来就讲强联通图、强联通分量
虽然这些理论知识以前学离散的时候都有所涉及,但是我还是太天真了
直接上几个算法,搞的我一脸懵逼了
开始讲连通分量感觉还好,直接用一下DFS就能判断一个无向图中有多少个连通分量
接下来的强联通分量,感觉听上去还好,但是我想多了
前提:前连通分量是针对有向图而言
至于判断有向图是不是强联通图,直接用DFS感觉就可以,
但是如果有向图没强连通,即:非强连通有向图的极大连通子图称为强连通分量
重点来了,求非强联通有向图的强连通分量
两种算法:
1、Kosaraju算法:两次DFS,实现较容易
2、Tarjan算法:一次DFS,实现较复杂,
还有一种Tarjan算法的改进版,但是我并没有看
至于这两种算法,也只是在下午了解了下原理,代码实现一直都没来得急。。。
1、Kosaraju算法:对有向图和它的逆图实施两次DFS
时间复杂度O(N+M)
2、Tarjan算法:感觉还是挺巧妙的,在DFS时,运用了一个栈,进行相关操作
保留两个大佬的博客,到时候等有时间的时候,一定要找些题,用代码实现下:
讲完连通分量之后,有稍微介绍了下:双连通分量,调用Tarjan算法稍微变形
(三):
终于能让我缓缓了,接下来的二分图,由于暑假有自学到,于是感觉还挺简单的,但是还是好多东西没掌握,只是小巫见大巫
虽然二分图匹配问题:匈牙利算法有所了解,但是只是了解了它的DFS实现,但是没了解它的BFS实现
回到二分图…
只要是:
二分图最大匹配——匈牙利算法
最小点覆盖=最大匹配数——匈牙利算法
最大独立集=顶点数-最大匹配数——匈牙利算法
最小路径覆盖数=原图点数-新图最大匹配数——匈牙利算法
针对这个,下午做了几道有代表性的简单题
具体见这篇博客:https://blog.csdn.net/boliu147258/article/details/100006006
虽然匈牙利算法掌握的差不多了,但是关于匈牙利的改进算法:Hopcroft-Karp算法
以及在带权的二分图找权值最大的完备匹配算法:KM(Kuhn-Munkres)算法
还是没有掌握,这一下子要补的东西越来越多了
(四):
网络流
好吧,没来得及看, 关键是太懒了,
找了一篇博客,以后回来补吧…