非常牛 H 开头的算法
考前发现欧拉回路不会。
然后寻求多方大佬,最后比较深刻地理解了一个叫 Hierholzer 的算法。
这个算法暴力写法是:
-
先找一条欧拉路径,然后把这个路径上的点删了。
-
再看看这个链上的点能不能再被换成环,能的话就把这个点换成新找的路径,这步用链表插入,这个过程是递归的。
复杂度很牛逼,是
void dfs(int x) {
//找环
}
void h_kai_tou_de_suan_fa(int x) {
dfs(x);
//设 circle 为找到的环
for(int i = 0; i < (int)circle.size() - 1; i++) del_edge(circle[i], circle[i - 1]);
for(auto y : circle) {
h_kai_tou_de_suan_fa(y);
// 在 circle 中插入新找到的环
}
}
但是一看就是巨大难写的东西。考虑有没有优美的写法。
注意到没必要把回路显式建出来。
回溯的时候已经遍历了整条回路,所以回溯的时候去找环就好了。
这就是我们平常见到的欧拉回路为什么要遍历完出边再把当前点入栈的原因。
void dfs(int x){
for(int i = head[x]; i; i = head[x]){
head[x] = e[i].nxt;
dfs(e[i].to);
}
ss.push(x);
}
拜谢 Alex_Wei。
参考文献:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】