10.25 考试总结
距离退役死亡越来越近。
circle
其实只要暴力查找就可以了
搜索跑图,稍微注意一下不要让法师反复横跳就可以了,多加一个数据就可以解决只要一找到已经访问过的就证明是环了....
开始想复杂了,以为可能有一个奇葩的图....原来就是一个简单的环啊
path
其实就是找必经之路,把一些可以多选择的....缩点,实际上就是tarjan缩点, 然后找桥。
桥就是我们要的必经之路
然后又要去学tarjan.....模板一下背不下来
mst
首先用prim 作出最小生成树。然后考虑修改哪条边的权值。
修改的边一定要选,那么我们只需要将这条边两端的点a; b 在最小生成树上的路径找出来,然后删掉路
径中边权最大的即可得到答案。
时间复杂度 \[O(n^2)\]
final
以我的能力就是暴力dijkstra了,最后好像是string爆空间了。实际上最好的应该是记录路径是最好的
这题有思维性,挺有意思的。三种算法都值得写。
用dijkstra + heap 实现算法。那么主要的问题是如何判断两条路径的字典序。
笨一点的方法:如果是两个字符串,则可以用二分+ hash 截取相同的前缀。然后看下一位的字符哪个更优即可。不过现在字符串都是路径,那么就不能二分,需要用倍增的方式来解决(类似LCA,需要先将两个字符串的长度变成相等的)。好像时间复杂度还不好过,而且不怎么好写。
聪明一点的方法:注意dijkstra 算法保证了字典序是递增的,所以每次如果需要更新一个点的路径时,我们只要比对最后一个字符(如果前面的串相等就比较,否则不需要更新)。在堆中更新也是类似的,如果前面相等就比较最后一个字符,否则更差。时间复杂度 \[O(n + mlog n)\] 。好写一些了。
原文地址:https://www.cnblogs.com/rendex/p/9866678.html
时间: 2024-10-12 06:50:50