1184. 欧拉回路

题目链接

1184. 欧拉回路

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

输入格式

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

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

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

如果 t=1 则表示 viui 有一条无向边。
如果 t=2 则表示 viui 有一条有向边。
图中可能有重边也可能有自环。

点的编号从 1n

输出格式

如果无法一笔画出欧拉回路,则输出一行: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 条边的编号。

数据范围

1n105,
$0≤m≤2×10^5

输入样例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
  • 时间复杂度:O(n+m)

代码

// Problem: 欧拉回路 // Contest: AcWing // URL: https://www.acwing.com/problem/content/1186/ // Memory Limit: 64 MB // Time Limit: 1000 ms // %%%Skyqwq #include <bits/stdc++.h> #define pb push_back #define fi first #define se second #define mp make_pair using namespace std; typedef long long LL; typedef pair<int, int> PII; template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; } template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; } template <typename T> void inline read(T &x) { int f = 1; x = 0; char s = getchar(); while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); } while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar(); x *= f; } const int N=1e5+5,M=4e5+5; int h[N],e[M],ne[M],idx; int type,n,m,din[N],dout[N],res[M],cnt; bool used[M]; void add(int a,int b) { e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void dfs(int u) { for(int &i=h[u];~i;) { if(used[i]) { i=ne[i]; continue; } used[i]=true; if(type==1)used[i^1]=true; int t=i+1; if(type==1) { t=i/2+1; if(i&1)t=-t; } int j=e[i]; i=ne[i]; dfs(j); res[++cnt]=t; } } int main() { memset(h,-1,sizeof h); scanf("%d",&type); scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { int u,v; scanf("%d%d",&u,&v); dout[u]++,din[v]++; add(u,v); if(type==1)add(v,u); } if(type==1) { for(int i=1;i<=n;i++) if((din[i]+dout[i])&1) { puts("NO"); return 0; } } else { for(int i=1;i<=n;i++) if(din[i]!=dout[i]) { puts("NO"); return 0; } } for(int i=1;i<=n;i++) if(h[i]!=-1) { dfs(i); break; } if(cnt<m) { puts("NO"); return 0; } puts("YES"); for(int i=cnt;i;i--)printf("%d ",res[i]); return 0; }

__EOF__

本文作者acwing_zyy
本文链接https://www.cnblogs.com/zyyun/p/15849541.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zyy2001  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示