本文转载自我的公众号文章,原文是 lee 神写的,已获原文作者授权。
本期给大家带来图论基础知识的最后一部分总结。
Slides 的制作素材大部分来源于网络,出处大多无从查起,这里感谢原创内容。但我相信知识的分享是无价的,正如鲁迅所说:“有人翻印,功德无量。”
我们重点来介绍一下邻接矩阵。
- 用矩阵的理论和分析方法来研究图论,将图的一些问题转换为矩阵运算问题,更适合于计算机处理。
- 图在计算机中就是以矩阵形式存贮和读取的,也可借助图的理论和方法研究矩阵中的问题
这里插播一道例题,骑士拨号器。
这题最朴素的思路是把电话号码转化成图,用有memo的DFS来做这道题。下面给出Discussion区@peritan的答案。
这题同时很好诠释DP & BFS & DFS 三者之间微妙的关系,读者可以悉心体会甄别其间异同。在上一期的讲解中我们提到了这几者的关系。
下面我们再来看一下,同样很Straight Forward的iteration解法。可以看到,迭代计算的部分,就是图的边的关系。
下面的图表中,给出了每个号码的初始值,和他们增长的效果。我个人觉得有点像马尔可夫链的效果,很容易和矩阵运算联系到一起。
所以我们可以把他们的转化关系用矩阵来表示,每一步的路径数目,用矩阵幂运算来计算。矩阵幂运算可以优化到O(logN),矩阵运算的模版网上很多,不是模版党暂且不表,手撸也相当好写。同样的方法也可以用在很多地方,个别题难点会体现在关系矩阵的构造上,其本质就是线性变化,能递推就可以快速幂。
回到我们的主题,下面讲一下,算法题中我经常使用的,存储图的数据结构,邻接表。
以上就是我们图论基础知识的总结。练好图中一般的DFS和BFS写法,就成功了一大半。常涉及的进阶图论知识,还有一些用人名命名的各种算法,包括不限于: 两种最小生成树MST,三种最短路径,公共祖先LCA。鉴于我和他们这些人也不太熟,暂且不表啦,期待其他老师投稿啦。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。