简单图论总结
一些碎碎念
最近复习了一些简单图论的知识,主要有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的本质是尝试向一个集合
1.k的枚举可以不按顺序,也可以通过拆分整个过程分多次完成。具体的题目可以看P1119
2.这个思想可以迁移到其他地方,如维护图的连通性等。事实上,只要是能写成这种dp的问题都可以如此求解。这样的问题往往具有可由子问题递推过来且n较小的特点(感觉这是句废话,捂脸)参考题目此题也可以用拓扑排序解决,尽管本人未能成功(樂)
拓扑排序
拓扑排序往往搭配其他算法(常见的如dp、并查集等等)一起使用,在处理综合问题的时候都可以考虑一手。本身似乎没什么特别的技巧
单源路径
最老生常谈的问题了,往往难的不是dij或者spfa算法本身,而是建图的方式。反向建图是一个重要技巧,一旦看到有关单源问题时都可以试着反向建图来反推过程。另一个建图技巧是分层图。如果题目中图的遍历规则会出现某些变化,则可以分层建图,利用向虚点创建权值为0的边来实现从层到层的跃迁。参考题目:CF605E
差分
其实就是就最短路或者最长路,分别对应求下界和上界,亦即最大值和最小值。注意求最长路时常常可以用拓扑排序而非spfa(当然spfa也不一定就过不去)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端