欧拉路径
欧拉路径
模板题
一个感性的定义:一笔画路径,经过一次所有的边,点可以多次走
特别的,若该路径的起点与终点相同,则称其为 欧拉回路
欧拉路径的存在条件:
- 此图连通;
- 对于无向图,当且仅当度数为奇的点的个数为 0 或 2;
- 对于有向图,当且仅当
- 入度与出度不同的点的个数为 0 或 2;
- 当入度与出度不同的点的个数为 2 时,必须要一个点(即路径终点)入度比出度多 1,一个点(即路径起点)入度比出度少1。
(我不会证明以上结论)
代码写法:
先判断有没有回路
然后找是否有入度比出度刚好少一的点,作为起点(基于上面的结论),否则把1(任一点)作为起点。
dfs删边,继续递归,把访问的点加入栈
依次输出栈中元素
补充:删边操作可以写成记录起点,每次循环无视起点之前的边,相当于删除了这些边。
正确性:有回路时想怎么走都可以。(其实就是不会证)
核心代码如下:
void oularoad(int u){
//不要看到有head数组就以为是链式前向星,下面的代码本质上还是链接列表
for(int i = head[u];i < edge[u].size(); i = head[u]){
//注:用auto x : edge[u]的写法不方便记录删边,老老实实写循环
head[u] = i + 1;
oularoad(edge[u][i]);
}
stk.push(u);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具