当前位置: 首页 > news >正文

1184. 欧拉回路(欧拉回路,模板题)

活动 - AcWing

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

输入格式

第一行包含一个整数 t,t∈{1,2},如果 t=1,表示所给图为无向图,如果 t=2,表示所给图为有向图。

第二行包含两个整数 n,m,表示图的结点数和边数。

接下来 m 行中,第 i 行两个整数 vi,ui,表示第 i 条边(从 11 开始编号)。

  • 如果 t=1 则表示 vi 到 ui 有一条无向边。
  • 如果 t=2 则表示 vi 到 ui 有一条有向边。

图中可能有重边也可能有自环。

点的编号从 1 到 n。

输出格式

如果无法一笔画出欧拉回路,则输出一行:NO。

否则,输出一行:YES,接下来一行输出 任意一组 合法方案即可。

  • 如果 t=1,输出 m 个整数 p1,p2,…,pm。令 e=|pi|,那么 e 表示经过的第 i 条边的编号。如果 pi 为正数表示从 ve 走到 ue,否则表示从 ue 走到 ve。
  • 如果 t=2,输出 m 个整数 p1,p2,…,pm。其中 pi 表示经过的第 i 条边的编号。
数据范围

1≤n≤105
0≤m≤2×105

输入样例1:
1
3 3
1 2
2 3
1 3
输出样例1:
YES
1 2 -3
输入样例2:
2
5 6
2 3
2 5
3 4
1 2
4 2
5 1
输出样例2:
YES
4 1 3 5 2 6

解析: 

一、在无向图中(所有边都是连通的): 

(1)存在欧拉路径的充分必要条件:度数为奇数的点只能有0或2。 

(2)存在欧拉回路(起点和终点相同)的充分必要条件:度数为奇数的点只能有0个。 

二、在有向图中(所有边都是连通的): 

(1)存在欧拉路径的充分必要条件:要么所有点的入度均等于入度;要么除了两个点之外,其余所有的点的出度等于入度,剩余的两个点:一个满足出度比入度多1(起点),另一个满足入度比出度多1(终点)。 

(2)存在欧拉回路(起点和终点相同)的充分必要条件:所有点的入度均等于出度。 

欧拉回路的dfs用边来判重,不能用点。 

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 1e5 + 5, M = 4e5 + 5, INF = 0x3f3f3f3f;int n, m;
int h[N], e[M], ne[M], idx;
int din[N], dout[N];
int ans[M], cnt;
bool used[M];
int type;void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}void dfs(int u) {//cout << "_______________________" << u << endl;for (int& i = h[u]; i != -1;) {if (used[i]) {i = ne[i];continue;}int t;if (type == 1) {t = i / 2 + 1;if (i & 1)t = -t;}else t = i + 1;used[i] = 1;if (type == 1) {used[i ^ 1] = 1;}int j = e[i];i = ne[i];dfs(j);ans[++cnt] = t;}
}int main() {cin >> type;cin >> n >> m;memset(h, -1, sizeof h);for (int i = 1,a,b; i <= m; i++) {scanf("%d%d", &a, &b);add(a, b);if (type == 1)add(b, a);din[b]++, dout[a]++;}if (type == 1) {for (int i = 1; i <= n; i++) {if (din[i] + dout[i] & 1) {cout << "NO" << endl;return 0;}}}else {for (int i = 1; i <= n; i++) {if (din[i] != dout[i]) {cout << "NO" << endl;return 0;}}}for (int i = 1; i <= n; i++) {if (h[i] != -1) {dfs(i);break;}}if (cnt < m) {cout << "NO" << endl;return 0;}cout << "YES" << endl;for (int i = cnt; i; i--) {printf("%d ", ans[i]);}return 0;
}

http://www.lryc.cn/news/297289.html

相关文章:

  • 学习 Redis 基础数据结构,不讲虚的。
  • Android 11 webview webrtc无法使用问题
  • 嵌入式单片机中晶振的工作原理
  • AWS配置内网EC2服务器上网【图形化配置】
  • Android中的MVVM
  • 制作耳机壳的UV树脂和塑料材质相比劣势有哪些?
  • CSP-202012-1-期末预测之安全指数
  • Doris中的本地routineload环境,用于开发回归测试用例
  • 【开源项目阅读】Java爬虫抓取豆瓣图书信息
  • 基于opencv-python模板匹配的银行卡号识别(附源码)
  • JAVA设计模式之建造者模式详解
  • ElasticSearch查询语句用法
  • 美国服务器如何
  • 远程主机可能不符合glibc和libstdc++ VS Code服务器的先决条件
  • 【python基础】sys.argv[]的使用方法
  • Element-Ui el-date-picker日期传值异常问题解决办法
  • GO语言集成开发 JetBrains GoLand 2023 中文
  • 详细关于如何解决mfc140.dll丢失的步骤,有效修复mfc140.dll文件丢失的问题。
  • 聚簇索引、非聚簇索引、回表、索引下推、覆盖索引
  • ES实战-book笔记1
  • 高防服务器出租的优势及特点
  • NTLM||LM算法lsasswinlogon进程
  • transformer剪枝论文汇总
  • 使用 Ant Design 的 Upload 组件实现图片
  • 【知识图谱--第二讲知识图谱的表示】
  • C语言---计算n的阶乘
  • 材料非线性Matlab有限元编程:初应力法与初应变法
  • QT+OSG/osgEarth编译之八十二:osgdb_obj+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_obj)
  • [office] excel求乘积的公式和方法 #媒体#笔记#经验分享
  • OpenEuler20.03LTS SP2 上安装 OpenGauss3.0.0 单机部署过程(二)