欧拉回路详解

欧拉回路详解文章目录知识点例题知识点欧拉通路和欧拉回路 欧拉通路 对于图 G 来说 如果存在一条通路包含 G 的所有边 则该通路称为欧拉通路 也称欧拉路径 欧拉回路 如果欧拉路径是一条回路 那么称其为欧拉回路 欧拉图 含有欧拉回路的图是欧拉图 对有向图 G 和无向图 H 图 G 存在欧拉路径与欧拉回路的充要条件分别是 欧拉路径 图中所有奇度点的数量为 0 或 2 欧拉回路 图中所有点的度数都是偶数 图 H 存在欧拉路径和欧拉回路的充要条件分别为 欧拉路径 所有点的入度等于出度或者存在一点出度比入度大 1 起点 一点入

文章目录

知识点

  • 欧拉通路和欧拉回路:
    欧拉通路:对于图G来说,如果存在一条通路包含G的所有边,则该通路称为欧拉通路,也称欧拉路径。
    欧拉回路:如果欧拉路径是一条回路,那么称其为欧拉回路。
    欧拉图:含有欧拉回路的图是欧拉图。






  • 对有向图G和无向图H:
    图G存在欧拉路径与欧拉回路的充要条件分别是:
    欧拉路径:图中所有奇度点的数量为0或2.
    欧拉回路:图中所有点的度数都是偶数。






    图H存在欧拉路径和欧拉回路的充要条件分别为:
    欧拉路径:所有点的入度等于出度或者存在一点出度比入度大1(起点),一点入度比出度大1(终点),其他点的入度均等于出度。
    欧拉回路:所有点的入度等于出度。




例题

题目描述
给定一张图,请你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。
输入格式
第一行包含一个整数 t,t∈{1,2},如果 t=1,表示所给图为无向图,如果 t=2,表示所给图为有向图。
第二行包含两个整数 n,m,表示图的结点数和边数。
接下来 m 行中,第 i 行两个整数 vi,ui,表示第 i 条边(从 1 开始编号)。
如果 t=1 则表示 vi 到 ui 有一条无向边。
如果 t=2 则表示 vi 到 ui 有一条有向边。
图中可能有重边也可能有自环。
点的编号从 1 到 n。
数据范围
1 ≤ n ≤ 1 0 5 {10^5} 105,
0 ≤ m ≤ 2× 1 0 5 {10^5} 105
样例:
输入
1
3 3
1 2
2 3
1 3
输出
YES
1 2 -3












































AC代码:

#include  
     #include  
     #include  
     #include  
     using namespace std; const int N = , M = ; int h[N],e[M],ne[M],idx; int ans[N*2],cnt; bool used[M]; int din[N],dout[N]; int n,m,ver; void add(int a,int b){ 
    e[idx] = b,ne[idx] = h[a],h[a] = idx++; } void dfs(int u){ 
    for(int &i = h[u]; ~i; ){ 
    if(used[i]){ 
    //如果这条边用过了 i = ne[i]; //删除这条边 continue; } used[i] = true; //标记这条边已使用 if(ver == 1) used[i^1] = true; //如果是无向图,那么这条边的反向边也要标记使用过了 int t; if(ver == 1){ 
    t = i/2 + 1; if(i&1) t = -t; //(0,1) (2,3) (4,5) 奇数编号是返回的边 }else t = i+1; int j = e[i]; i = ne[i]; dfs(j); ans[cnt++] = t; } } int main() { 
    scanf("%d%d%d",&ver,&n,&m); memset(h,-1,sizeof h); for(int i = 0; i<m; i++){ 
    int a,b; scanf("%d%d",&a,&b); add(a,b); if(ver == 1) add(b,a); //无向边 din[b]++, dout[a]++; } if(ver == 1){ 
    for(int i = 1; i<=n; i++){ 
    if(din[i]+dout[i] &1){ 
    //无向图含欧拉回路的充要条件是每个点的度都为偶数 puts("NO"); return 0; } } }else{ 
    for(int i = 1; i<=n; i++){ 
    if(din[i] != dout[i]){ 
    //有向图含欧拉回路的充要条件是每个点的入度等于出度 puts("NO"); return 0; } } } for(int i = 1; i<=n; i++){ 
    if(~h[i]) { 
    dfs(i); break; } } if(cnt < m){ 
    puts("NO"); return 0; } puts("YES"); for(int i = cnt-1; i>=0; --i){ 
    cout<<ans[i]<<" "; } return 0; } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203443.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午9:47
下一篇 2026年3月19日 下午9:47


相关推荐

  • 将多个图层合并为一个

    将多个图层合并为一个用 ArcToolbox 里面的工具 ArcToolbox DataManageme General Merge 工具 添加所有要合并的图层 选择输出保存路径与文件名 点击确定就可以了

    2026年3月16日
    2
  • Python 脚本编写

    Python 脚本编写学习内容 Python 安装和环境设置运行和修改 Python 脚本与用户输入交互处理异常读写文件导入本地 标准和第三方模块在解释器中进行实验安装 Python 检查计算机是否安装了 Python 在终端窗口输入如下指令 并按回车 pythonversio 系统可能会显示已安装的 Python 版本是 Python2 7 9 在这种情况下 表明你已

    2026年3月17日
    2
  • 转自腾讯空间的文章看了心里有说不…

    转自腾讯空间的文章看了心里有说不…三十四吃饭的时候我仍是不停的咳嗽 哥看的皱眉 东子这家伙也是 我喝醉了不知道把我送回宿舍 把我往你那送 不知道该说他什么好 我飞快的瞟了一眼哥 接着低头吃面 东子说是你非要来找我的 哥半天没吭声 我抬头看他 哥的耳朵红红的 映着背面玻璃上的眼光 有点透明的红润 过了半天方说 我喝醉了嘛 那不就是了 东子哥也不比你好多少 说话都是大舌头的 我都担心他走回去找不到路 哥摇了

    2026年3月26日
    3
  • 无法解析的外部符号解决方法汇总[通俗易懂]

    无法解析的外部符号解决方法汇总[通俗易懂]本文介绍了如何在工程中使用.lib库,以及出现无法解析的外部符号的原因和解决方法。

    2022年6月28日
    39
  • 福昕阅读器drm加密解密总结

    福昕阅读器drm加密解密总结drm 是数字版权保护的一种方式 前一段时间在做四川文轩数字图书馆项目的时候用到了相关的知识 感觉这东西对于一些在线阅读和视频播放还是有很大用处的 对于其工作原理我也很好奇 先摘抄度娘的内容如下 当然你也可以直接访问度娘 http baike baidu com view 47310 htm fr aladdinDRM 技术的工作原理是 首先建立数字节目授权中心 编码压缩后的数字节目内容

    2026年3月19日
    1
  • 批处理for命令的用法_cmd批处理命令

    批处理for命令的用法_cmd批处理命令摘自WindowsXP的帮助文档。For对一组文件中的每个文件运行指定的命令。语法for{%variable|%%variable}in(set)docommand[CommandLineOptions]参数{%variable|%%variable}必需。代表可替换的参数。使用%variable通过命令提示符执行for命令。使用%%variable在批处理文件中执行for命令。变量要区分大小写,并且必须用Alpha值表示,例如,%A、%B或%C。.

    2022年10月12日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号