首页 > 其他分享 >UOJ 117. 欧拉回路

UOJ 117. 欧拉回路

时间:2023-08-04 16:33:55浏览次数:47  
标签:输出 环上 int 路径 117 回路 UOJ 欧拉

\(UOJ\) \(117\). 欧拉回路

一、题目描述

时间限制:\(1s\) 空间限制:\(256MB\)

有一天,一位灵魂画师画了一张\(n\)个点\(m\)条边(\(1≤n≤1e5,0≤m≤2e5\))的图。

现在要你找出 欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。

一共两个子任务:

这张图是无向图。(\(50\)分)
这张图是有向图。(\(50\)分)
图中可能有重边也可能有自环。

如果不可以一笔画,输出一行 NO

否则,输出一行 YES,接下来一行输出一组方案。

如果 \(t=1\),输出 \(m\) 个整数 \(p_1,p_2,…,p_m\)。令 \(e=∣p_i∣\),那么 \(e\) 表示经过的第 \(i\) 条边的编号。如果 \(p_i\)为正数表示从 \(v_e\) 走到 \(u_e\),否则表示从 \(u_e\) 走到 \(v_e\)。
如果 \(t=2\),输出 \(m\) 个整数 \(p_1,p_2,…,p_m\)。其中 \(p_i\) 表示经过的第 \(i\) 条边的编号。

二、题目解析

经典\(Hierholzer\)算法,复杂度\(O(E)\),判断存不存在,先判度,再判图是连通图

  • 有向图欧拉回路:图连通,一个环的情形(所有点入度出度相等),找环上一点输出路径

  • 有向图欧拉路径:图连通,一个环或一条链的情形(所有点入度出度相等,或仅有恰有两个点,其中一个入度=出度\(+1\),另一个出度=入度\(+1\)),找环上一点或链的起点输出路径

  • 无向图欧拉回路:图连通,一个环的情形(所有点度都为偶数),找环上一点输出路径

  • 无向图欧拉路径:图连通,一个环或一条链的情形(所有点度都为偶数,或仅有恰有两个度数为奇数的点),找环上一点或链的一端输出路径

欧拉回路性质:可以被拆成若干个环

三、实现代码

#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> PII;
const int N = 1e5 + 10, M = 2e5 + 10;
vector<PII> g[N];
int st[M];
int ans[M], al;
int din[N], dout[N];
int op, n, m;

// 需要删边优化
void dfs(int u) {
    while (g[u].size()) {
        PII x = g[u].back();
        g[u].pop_back();

        int v = x.first, id = x.second, fid = abs(id);
        if (st[fid]) continue;
        st[fid] = 1;
        dfs(v);
        ans[++al] = id; // 记录的是边号
    }
}
// 检查是不是存在欧拉回路
bool check() {
    int start = 1;
    if (op == 2) {
        for (int i = 1; i <= n; i++) {
            if (din[i] != dout[i]) return 0;
            if (din[i]) start = i;
        }
    } else {
        for (int i = 1; i <= n; i++) {
            if ((din[i] + dout[i]) & 1) return 0;
            if (din[i] + dout[i]) start = i;
        }
    }
    // 判连通,找出欧拉回路
    dfs(start);
    if (al < m) return 0;

    return 1;
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("UOJ117.in", "r", stdin);
#endif

    scanf("%d %d %d", &op, &n, &m);
    for (int i = 1; i <= m; i++) {
        int a, b;
        scanf("%d%d", &a, &b);
        g[a].push_back({b, i});               // 对边点,边号
        if (op == 1) g[b].push_back({a, -i}); // 无向图
        din[b]++, dout[a]++;
    }

    if (!check()) {
        puts("NO");
        return 0;
    }

    puts("YES");
    for (int i = al; i; i--) printf("%d ", ans[i]);
    return 0;
}

标签:输出,环上,int,路径,117,回路,UOJ,欧拉
From: https://www.cnblogs.com/littlehb/p/17606348.html

相关文章

  • P7771 【模板】欧拉路径
    \(P7771\)【模板】欧拉路径题目描述求有向图字典序最小的欧拉路径。输入格式第一行两个整数\(n,m\)表示有向图的点数和边数。接下来\(m\)行每行两个整数\(u,v\)表示存在一条\(u\tov\)的有向边。输出格式如果不存在欧拉路径,输出一行No。否则输出一行\(m+1\)个......
  • UOJ312 【UNR #2】梦中的题面
    好题。容斥后插板,要计算的形如\(\binom{Sum}{m}\)的样子。这个\(Sum\)可能会很大,不能直接设进状态,但是我们\(dp\)需要\(Sum\)计算组合数。解决方法是用范德蒙德卷积\[\sum_{i=0}^{k}{\binom{n}{i}\binom{m}{k-i}}=\binom{n+m}{k}\]设\(dp_i\)表示当前所有\(\binom......
  • 欧拉函数
    欧拉函数其实我接触挺久了,一开始就是为了做pta的题刷分才学的,,,后来发现,woc这玩意儿还挺有深度????这是我一开始的笔记,还挺潦草: 我自己也看了老半天才看明白我之前写的什么鬼玩意儿。。。。。。 重开。。。 欧拉函数(Euler'stotientfunction),即φ(n),表示的是小于等于n和n互质......
  • 华为 openEuler 欧拉操作系统安装
    使用OracleVMVirtualBox安装操作系统 安装过程:1、官网下载镜像备用 目前我选择下载 下载第三个安装时有个“设置基础软件仓库时出错”错  (目前不清楚什么情况) 下载地址:openEuler下载|欧拉系统ISO镜像|openEuler社区官网2、新建 跳过自动安装 配......
  • 欧拉函数
    欧拉函数的几个性质(以下\(p\)无特殊说明,都为质数):若\(gcd(a,b)=1\),则\(\varphi(a)\times\varphi(b)\),证明不会,大家记住就行了\(n=\sum_{d|n}\varphi(d)\)证明:设\(f(x)\)表示\(gcd(k,n)=x\)的数的个数(\(k<=n\))结论:\(n=\sum_{i=1}^nf(i)\)我们可以分类讨论(保证......
  • 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(10.A)- FlexSPI NAND启动时间(RT1170)
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MXRT1170FlexSPINAND启动时间。本篇是i.MXRT1170启动时间评测第四弹,前三篇分别给大家评测了RawNAND启动时间(基于MIMXRT1170-EVK_Rev.B)、SerialNOR启动时间(基于MIMXRT1170-EVB_Rev.A2)......
  • openEuler TechDay——熊博带你玩转欧拉
    openEuler是什么?是打破惯性的技术突破?是倾力合作的生态共建?还是踏浪前行的商业反哺?**openEulerTechDay本期邀请到了欧拉技术委员会熊伟博士,以对话的方式为大家答疑解惑,全方位立体剖析欧拉发展。**熊博将带你走入开源世界,透视欧拉最新进展,分享开源社区合作,探讨未来商业发展。多少欧......
  • 华为认证欧拉openEuler-HCIA命令行操作基础
    Linux命令基础知识linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心。上一篇:openEuler操作系统入门使用Linux命令行命令行更高效:Linux系统中使用键盘操作速度要......
  • UOJ #284. 快乐游戏鸡题解(长链剖分+单调栈合并)
    UOJ#284.快乐游戏鸡题解(长链剖分+单调栈合并)题面一番战斗之后,程序猿被计算鸡们赶走了。随着垫子计算鸡一声令下:“追!”,于是计算鸡村全村上下开始乘胜追击。计算鸡们希望在新的一年到来之际给程序猿以重创,出掉这一年的恶气。可是程序猿一追就走,一走就跑,一跑就无影无踪。计算鸡......
  • 117.STL中的multiset
    117.STL中的multiset1.multiset的介绍1.multiset是按照特定顺序存储元素的容器,其中元素是可以重复的2.在multiset在,元素的value也会识别它组成的键值对,multiset元素的值不能在容器中进行修改,但可以插入和删除3.在内部,multiset按照特定的严格弱排序准则进行排序4.multiset容......