news 2026/5/1 10:03:44

信奥赛C++提高组csp-s之欧拉回路(案例实践)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
信奥赛C++提高组csp-s之欧拉回路(案例实践)

信奥赛C++提高组csp-s之欧拉回路(案例实践)

欧拉路径

题目描述

求有向图字典序最小的欧拉路径。

输入格式

第一行两个整数n , m n,mn,m表示有向图的点数和边数。

接下来m mm行每行两个整数u , v u,vu,v表示存在一条u → v u\to vuv的有向边。

输出格式

如果不存在欧拉路径,输出一行No

否则输出一行m + 1 m+1m+1个数字,表示字典序最小的欧拉路径。

输入样例1
4 6 1 3 2 1 4 2 3 3 1 2 3 4
输出样例1
1 2 1 3 3 4 2
输入样例2
5 5 1 2 3 5 4 3 3 4 2 3
输出样例2
1 2 3 4 3 5
输入样例3
4 3 1 2 1 3 1 4
输出样例3
No
说明/提示

对于50 % 50\%50%的数据,n , m ≤ 10 3 n,m\leq 10^3n,m103

对于100 % 100\%100%的数据,1 ≤ u , v ≤ n ≤ 10 5 1\leq u,v\leq n\leq 10^51u,vn105m ≤ 2 × 10 5 m\leq 2\times 10^5m2×105

保证将有向边视为无向边后图连通。


问题分析

  • 问题类型:有向图欧拉路径/回路
  • 特殊要求:输出字典序最小的路径,不存在则输出"No"
  • 图特点:简单有向图,无重边自环
  • 数据范围:n≤105,m≤2×105

解题思路

  1. 统计每个顶点的入度和出度
  2. 检查是否存在欧拉路径/回路:
    • 计算起终点数量
    • 验证度数条件
  3. 确定起点:
    • 欧拉路径:起点为出度=入度+1的顶点
    • 欧拉回路:起点为最小的有边顶点
  4. 使用Hierholzer算法DFS遍历
  5. 使用邻接表存储,并排序保证字典序
  6. 检查路径长度,确保图连通

代码实现

#include<bits/stdc++.h>usingnamespacestd;constintMAXN=100005;// 最大顶点数constintMAXM=200005;// 最大边数intn,m;// 顶点数和边数vector<int>graph[MAXN];// 邻接表存储图intinDegree[MAXN];// 入度数组intoutDegree[MAXN];// 出度数组vector<int>eulerPath;// 存储欧拉路径intcurrentEdgeIndex[MAXN];// 记录每个顶点当前访问到哪条边// 深度优先搜索,寻找欧拉路径voiddfs(intcurrentVertex){// 使用当前边的索引,避免重复检查已访问的边while(currentEdgeIndex[currentVertex]<(int)graph[currentVertex].size()){// 获取下一个要访问的顶点intnextVertex=graph[currentVertex][currentEdgeIndex[currentVertex]];// 移动到下一条边(模拟删除已访问的边)currentEdgeIndex[currentVertex]++;// 递归访问下一个顶点dfs(nextVertex);}// 回溯时记录当前顶点eulerPath.push_back(currentVertex);}intmain(){ios::sync_with_stdio(false);cin.tie(0);cin>>n>>m;// 读入边并构建图for(inti=0;i<m;i++){intu,v;cin>>u>>v;graph[u].push_back(v);outDegree[u]++;// 更新出度inDegree[v]++;// 更新入度}// 为了得到字典序最小的路径,对每个顶点的邻接表排序for(inti=1;i<=n;i++){sort(graph[i].begin(),graph[i].end());}// 检查是否存在欧拉路径或回路intstartVertex=1;// 默认起点intstartCount=0;// 出度比入度大1的顶点数量(起点候选)intendCount=0;// 入度比出度大1的顶点数量(终点候选)boolisValid=true;// 是否满足欧拉路径条件for(inti=1;i<=n;i++){intdiff=outDegree[i]-inDegree[i];if(diff==1){// 找到一个可能的起点startCount++;startVertex=i;// 更新起点}elseif(diff==-1){// 找到一个可能的终点endCount++;}elseif(diff!=0){// 不满足欧拉路径条件isValid=false;break;}}// 验证起点和终点数量是否合法if(!isValid||!((startCount==0&&endCount==0)||(startCount==1&&endCount==1))){cout<<"No"<<endl;return0;}// 如果是欧拉回路(所有顶点入度=出度),需要找到最小的有出度的顶点作为起点if(startCount==0){for(inti=1;i<=n;i++){if(outDegree[i]>0){startVertex=i;break;}}}// 从起点开始深度优先搜索dfs(startVertex);// 检查路径长度是否正确(应该是边数+1)if((int)eulerPath.size()!=m+1){cout<<"No"<<endl;return0;}// 输出欧拉路径(注意:路径是逆序存储的,需要反向输出)reverse(eulerPath.begin(),eulerPath.end());for(inti=0;i<(int)eulerPath.size();i++){cout<<eulerPath[i]<<" ";}cout<<endl;return0;}

关键点解释

  1. 邻接表优化:使用vector存储邻接表,节省空间
  2. 度数验证:严格检查欧拉路径存在的条件
  3. 字典序保证:对每个顶点的邻接表排序
  4. 防止重复访问:使用currentEdgeIndex数组记录访问进度
  5. 连通性检查:通过路径长度验证图是否连通

各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}
  • 一、CSP信奥赛C++通关学习视频课:
    • C++语法基础
    • C++语法进阶
    • C++算法
    • C++数据结构
    • CSP信奥赛数学
    • CSP信奥赛STL
  • 二、CSP信奥赛C++竞赛拿奖视频课:
    • 信奥赛csp-j初赛高频考点解析
    • CSP信奥赛C++复赛集训课(12大高频考点专题集训)
  • 三、csp高频考点知识详解及案例实践:
    • CSP信奥赛C++之动态规划
    • CSP信奥赛C++之标准模板库STL
    • 信奥赛C++提高组csp-s知识详解及案例实践
  • 四、考级、竞赛刷题题单及题解:
    • GESP C++考级真题题解
    • CSP信奥赛C++初赛及复赛高频考点真题解析
    • CSP信奥赛C++一等奖通关刷题题单及题解

详细内容:

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转


2、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

4、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:24:42

Go语言数据结构和算法(三十四)分治算法

分治算法是将一个巨大的输入分解成若干个小块.在每个小块上解决问题.然后将分段解决方案合并为全局解决方案.1.步骤:分解:将原始问题分解成一组子问题.解决子问题:递归的单独解决每个子问题.合并子问题:将子问题的解放在一起得到整个问题的解.2.应用:2.1快速排序:又称分区交互排…

作者头像 李华
网站建设 2026/5/1 6:13:05

quickbi数据集报错

错误码: NOX5200013traceId: a2b3506c-aa59-4b01-a48e-2aa348021a72[NOX5200013] invalid calculate field [直播购买客户], expression syntax error or some dependence field [14513112cb] has gone.原因&#xff1a;之前新建的维度字段或者计算字段&#xff0c;依赖了其他字…

作者头像 李华
网站建设 2026/5/1 7:24:39

WE Learn智能学习助手终极指南:5步开启高效学习新时代

WE Learn智能学习助手终极指南&#xff1a;5步开启高效学习新时代 【免费下载链接】WELearnHelper 显示WE Learn随行课堂题目答案&#xff1b;支持班级测试&#xff1b;自动答题&#xff1b;刷时长&#xff1b;基于生成式AI(ChatGPT)的答案生成 项目地址: https://gitcode.co…

作者头像 李华
网站建设 2026/5/1 7:24:37

全网最全9个AI论文软件,助本科生轻松搞定毕业论文!

全网最全9个AI论文软件&#xff0c;助本科生轻松搞定毕业论文&#xff01; AI 工具如何改变论文写作的未来 在当今这个信息爆炸的时代&#xff0c;本科生面对毕业论文的压力日益增大。从选题到写作&#xff0c;再到查重和修改&#xff0c;每一个环节都可能成为学生心中的“拦路…

作者头像 李华
网站建设 2026/5/1 7:25:02

移动网络信号指标与单位整理(2G/3G/4G/5G Android vs IoT)

1️⃣ 核心概念 指标网络描述单位注意点RSSI2G/3G/4G/5G接收信号强度指标&#xff08;总功率&#xff0c;含噪声和邻区信号&#xff09;ASU / dBm仅量化信号强弱&#xff0c;2G/3G/4G 含义不同&#xff0c;非单小区物理功率RSCP3G单小区信号功率dBmRSCP Received Signal Code…

作者头像 李华
网站建设 2026/5/1 8:18:25

介绍如何在电脑上查看 iPhone 和 iPad 的完整设备信息

在很多场景下&#xff0c;我们真正关心的问题并不是某个 App 怎么运行&#xff0c;而是它运行在什么设备上。 同一份安装包&#xff0c;在不同 iPhone、不同 iPad 上表现不一致&#xff1b; 同一系统版本&#xff0c;电池健康、磁盘状态却差异明显&#xff1b; 甚至连摄像头、主…

作者头像 李华