UOJ 117. 欧拉回路
. 欧拉回路
一、题目描述
时间限制: 空间限制:
有一天,一位灵魂画师画了一张个点条边()的图。
现在要你找出 欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。
一共两个子任务:
这张图是无向图。(分)
这张图是有向图。(分)
图中可能有重边也可能有自环。
如果不可以一笔画,输出一行 NO
。
否则,输出一行 YES
,接下来一行输出一组方案。
如果 ,输出 个整数 。令 ,那么 表示经过的第 条边的编号。如果 为正数表示从 走到 ,否则表示从 走到 。
如果 ,输出 个整数 。其中 表示经过的第 条边的编号。
二、题目解析
经典算法,复杂度,判断存不存在,先判度,再判图是连通图
-
有向图欧拉回路:图连通,一个环的情形(所有点入度出度相等),找环上一点输出路径
-
有向图欧拉路径:图连通,一个环或一条链的情形(所有点入度出度相等,或仅有恰有两个点,其中一个入度=出度,另一个出度=入度),找环上一点或链的起点输出路径
-
无向图欧拉回路:图连通,一个环的情形(所有点度都为偶数),找环上一点输出路径
-
无向图欧拉路径:图连通,一个环或一条链的情形(所有点度都为偶数,或仅有恰有两个度数为奇数的点),找环上一点或链的一端输出路径
欧拉回路性质:可以被拆成若干个环
三、实现代码
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2022-08-04 HDU 1711 Number Sequence
2021-08-04 P1229 遍历问题
2019-08-04 国王分金币
2019-08-04 口算题卡升级版本
2016-08-04 在线查看PDF文档