欧拉回路学习总结

欧拉回路学习总结欧拉回路学习总结 nbsp 理解 设 G V E 是一个图 欧拉回路图 G 中经过每条边一次并且仅一次的回路称作欧拉回路 欧拉路径图 G 中经过每条边一次并且仅一次的路径称作欧拉路径 欧拉图存在欧拉回路的图称为欧拉图 半欧拉图存在欧拉路径但不存在欧拉回路的图称为半欧拉图 nbsp 思想 nbsp 首先明确一点 如果原图存在孤立点 那么我们去除孤立点不会对答案有所影响 然后我们

欧拉回路学习总结

 

理解:

G = (V, E)是一个图。

欧拉回路 图G中经过每条边一次并且仅一次的回路称作欧拉回路。

欧拉路径 图G中经过每条边一次并且仅一次的路径称作欧拉路径。

欧拉图 存在欧拉回路的图称为欧拉图。

半欧拉图 存在欧拉路径但不存在欧拉回路的图称为半欧拉图。

 

思想:

 首先明确一点,如果原图存在孤立点,那么我们去除孤立点不会对答案有所影响,然后我们来看下面的定理。

定理1 无向图G为欧拉图,当且仅当G为连通图且所有顶点的度为偶数。

推论1 无向图G为半欧拉图,当且仅当G为连通图且除了两个顶点的度为奇数之外,其它所有顶点的度为偶数。

定理2 有向图G为欧拉图,当且仅当G的基图(即将所有的有向边改为无向边所成的图)连通,且所有顶点的入度等于出度。

推论2 有向图G为半欧拉图,当且仅当G的基图连通,且存在顶点u 的入度比出度大1、v的入度比出度小1,其它所有顶点的入度等于出度。

显然,证明什么的我是不会的(有没有发现向小时候的一笔画,其实就是·····)

 

时间复杂度:

    直接 dfs 便利即可,所以复杂度为线性。

 

适用例题:

uoj 117

分析:欧拉回路 板子题,我就不说多了。

Source:

#include #include #include #include #include #include #include using namespace std; const int MAXM =  + 50; const int MAXN =  + 50; inline void R(int &v) { char c = 0; bool p = true; v = 0; while(!isdigit(c)) { if(c == '-') p = false; c = getchar(); } while(isdigit(c)) { v = (v << 3) + (v << 1) + (c ^ '0'); c = getchar(); } if(!p) v = -v; } int first[MAXN], tot = 1, t, n, m, x, y; int ans[MAXM], top, id[MAXN], od[MAXN]; bool vis[MAXM]; struct node { int next, to; } edge[MAXM]; inline void create(int x, int y) { tot++, edge[tot].next = first[x], first[x] = tot, edge[tot].to = y; } void read() { R(t), R(n), R(m); for(int i = 1; i <= m; ++i) { R(x), R(y), create(x, y); if(t == 1) create(y, x); od[x]++, id[y]++; } } void dfs(int cur) { //cout << cur << '\n'; for(int &p = first[cur]; p; p = edge[p].next) { int judge = (t == 1 ? (p / 2) : (p - 1)); bool sig = p & 1; if(vis[judge]) continue; //cout << cur << " " << edge[p].to << '\n'; vis[judge] = true, dfs(edge[p].to); if (cur == 1) cout << "top" << top << endl; top++, ans[top] = ((t == 1) ? (sig ? -judge : judge) : judge); } } void work() { if(t == 1) { for(int i = 1; i <= n; ++i) if((id[i] + od[i]) & 1) cout << "NO", exit(0); } else { for(int i = 1; i <= n; ++i) if(id[i] != od[i]) cout << "NO", exit(0); } for(int i = 1; i <= n ; ++i) if(first[i]) { dfs(i); break; } if(top != m) cout << "NO", exit(0); cout << "YES" << '\n'; for(int i = m; i >= 1; --i) cout << ans[i] << " "; } int main() { read(); work(); return 0; } 

欧拉回路学习总结

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2026年3月17日 下午10:06
下一篇 2026年3月17日 下午10:06


相关推荐

  • nc的使用_p什么nc什么l

    nc的使用_p什么nc什么l什么是ncnc是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具nc的作用(1)实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口(2)端口的扫描,nc可以作为client发起TCP或UDP连接(3)机器之间传输文件(4)机器之间网络测速…

    2025年6月11日
    4
  • Linux安装Node.js(图文解说详细版)

    Linux安装Node.js(图文解说详细版)第一步,下载安装包https://nodejs.org/dist/v12.14.1/第二步,上传到云服务器第三步,解压源码tar-zxvfnode-v12.14.1-linux-x64.tar.gz第四步,验证是否成功出现版本号说明成功了第五步,设置全局命令行vim/etc/profile之后就在任何地方的命令行输入node-v显示出信息就说明安装成功了…

    2022年10月20日
    4
  • 关于linux中文输入法

    关于linux中文输入法关于 linux 中文输入法环境 操作系统 kali 基于 Debian 开发完整安装 kali 桌面 gnomelinux 输入法第一印象搜狗输入法但是按照网上的教程一直报错 报错如下 1 缺少依赖源 解决找到 debian 官方源 2 依赖包和现有系统包冲突就这搞了一上午 没搞好下午准备安装别的输入法看到知乎有个可以用 直接安装好了 但是不显示软件中搜索输入法 设置 fcitx 架构设置键盘里还是找不到输入法浪费了好久 想到关机重启 好了 任务栏有图标了 选择输入法后可以了准备写代码

    2026年3月18日
    2
  • 幸福课第11讲_笔记

    幸福课第11讲_笔记11例行公事1.身体反馈假说2.没有更多的自律3.认知重建4.总结:如何成为成功人士,专家5.日记知道我们为什么要考试吗?—为了让你主动去整合我们之前学过的东西,这个课每节之间有联系的,你要去总结身体反馈假说理论:你在和你自己交流,通过伪造行为上的笑等–你的思想也和其保持一致实验:内向男144分钟聊天—(异性在男生不知觉该实验的情况下,主动谈笑风生12分钟x6个x2次…

    2022年7月18日
    16
  • 小白教程!!!win10如何安装Windows和Linux双系统??

    小白教程!!!win10如何安装Windows和Linux双系统??最近升级了win10装了一块固态硬盘,决定装一个双系统玩玩,正好公司运维大哥没事干,在他的帮助下,加上上网看了看发现关于win10的双系统双硬盘安装教程大都语焉不详,要么就是从别处复制粘贴的,这里发一个我的安装步骤如下:一:去官网下载Ubuntu系统 地址:https://www.ubuntu.com/download/desktop问题来了,去哪里下载一个linux系统呢?很简单,去官…

    2022年7月24日
    7
  • oracle roseha 配置,RoseHA8.5 for Windows Oracle11g配置文档

    oracle roseha 配置,RoseHA8.5 for Windows Oracle11g配置文档RoseHA8 5forWindowsO 配置文档目录一文档说明 1 二安装 Oracle

    2026年3月16日
    2

发表回复

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

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