简单图论总结

一些碎碎念

最近复习了一些简单图论的知识,主要有floyd,spfa,拓扑排序,dij,差分等等。其实真正意义上的算法就是floyd和dij以及拓扑排序(spfa目前的应用场景仅限于有负边的最短路,然而听说可能还打不过BF?我对此有点不信的)。下面记录一下最近做题时这些算法常见的技巧

floyd

对于第一次学习的人来说,它的正确性可能是显然的,但是并非所有人都真正明白它的正确性来自什么。比如,为什么三层循环的最外层枚举的是中转点?能不能交换三个变量的枚举顺序?答案是不能的。其原因在于,它的本质是一个dp。

rep(k,1,n)
rep(i,1,n)
rep(j,1,n){
f[i][j]=min(f[i][j],f[i][k]+f[k][j])
}

对于以上的代码,f的意思应该是:当从i到j的路径中的点的最大标号不超过当前的k时能获得的最短路。换而言之,枚举k的本质是尝试向一个集合U={a1,a2...an}中添加元素,维护U中的点两两之间的最短路。搞懂了这个我们就很容易推出以下结论:
1.k的枚举可以不按顺序,也可以通过拆分整个过程分多次完成。具体的题目可以看P1119
2.这个思想可以迁移到其他地方,如维护图的连通性等。事实上,只要是能写成这种dp的问题都可以如此求解。这样的问题往往具有可由子问题递推过来且n较小的特点(感觉这是句废话,捂脸)参考题目此题也可以用拓扑排序解决,尽管本人未能成功(樂)

拓扑排序

拓扑排序往往搭配其他算法(常见的如dp、并查集等等)一起使用,在处理综合问题的时候都可以考虑一手。本身似乎没什么特别的技巧

单源路径

最老生常谈的问题了,往往难的不是dij或者spfa算法本身,而是建图的方式。反向建图是一个重要技巧,一旦看到有关单源问题时都可以试着反向建图来反推过程。另一个建图技巧是分层图。如果题目中图的遍历规则会出现某些变化,则可以分层建图,利用向虚点创建权值为0的边来实现从层到层的跃迁。参考题目:CF605E

差分

其实就是就最短路或者最长路,分别对应求下界和上界,亦即最大值和最小值。注意求最长路时常常可以用拓扑排序而非spfa(当然spfa也不一定就过不去)

posted @   wxk123  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示