信息学奥赛一本通 欧拉回路
不懂欧拉回路概念的可以看看这篇
(3条消息) 欧拉回路总结 + 例题 铲雪车_wsh1931的博客-CSDN博客
给定一张图,请你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。输入格式 第一行包含一个整数 t,t∈{1,2},如果 t=1,表示所给图为无向图,如果 t=2,表示所给图为有向图。第二行包含两个整数 n,m,表示图的结点数和边数。接下来 m 行中,第 i 行两个整数 vi,ui,表示第 i 条边(从 1 开始编号)。如果 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
典型的欧拉回路模板题:
#include <cstdio> #include <cstring> #include <iostream>using namespace std;const int N = 100010, M = 400010;int cnt; int n, m; int type; int ans[M / 2]; bool used[M]; int din[N], dout[N]; int h[N], e[M], ne[M], idx;void add(int a, int b) {e[idx] = b;ne[idx] = h[a];h[a] = idx;idx ++ ; }void dfs(int u) {for (int &i = h[u]; i != -1; ){if (used[i])//若该边使用过{i = ne[i];//删除这条边continue;}used[i] = true;//标记这条边被使用过if (type == 1) used[i ^ 1] = true;//若为无向图,则要把他的反边标记int t;if (type == 1)//若为无向图{t = i / 2 + 1;//i这条边所对应的点t(邻接表以边0,1为一条无向边,边2,3为一条无向边,)if (i & 1) t = -t;}else t = i + 1;//若为有向图,i这条边所对应的边为i + 1因为我们存的边下标从0开始即初始时idx = 0;int j = e[i];//在递归之前删掉边,而不是将这两条写在for里i = ne[i];//若放在for则当它再次遍历到这个点的时候边i仍然还未被删去,所以会tledfs(j);ans[++ cnt] = t;//先遍历后存数,所以存的是边的倒叙} }int main() {cin >> type;cin >> n >> m;memset(h, -1, sizeof h);for (int i = 0; i < m; i ++ ){int a, b;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) {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) //若遍历到的遍小于m条即不能遍历所有的边。即边不连通{puts("NO");return 0;}puts("YES");//排除了一切不可能即为正确答案for (int i = cnt; i ; i -- ) printf("%d ", ans[i]);//ans存的是边的倒序puts("");return 0; }
信息学奥赛一本通 欧拉回路相关推荐
- 信息学奥赛一本通OJ勘误
信息学奥赛一本通OJ 是面向信奥初学者的很好用的OJ,感谢网站作者的的耐心制作. 尽管如此,该网站还是有一些错误,在此指明.瑕不掩瑜,希望网站作者早日修正. 1198:逆波兰表达式 题目中概念错误,应 ...
- 信息学奥赛一本通_长乐一中老师演绎“奥赛传奇”
董永建(右一)在课堂上. 台海网5月14日讯 据福州晚报报道,长乐一中有一位"传奇"老师--15年来,他辅导的学生在全国高中生信息学奥赛中获金牌3人次.银牌3人次.铜牌5人次:在全 ...
- 信息学奥赛一本通 提高篇 第5章 矩阵乘法
例1 矩阵AXB 信息学奥赛一本通(C++版)在线评测系统 [矩阵乘法]矩阵A×B_Uletay-CSDN博客 矩阵乘法--矩阵A×B_vina的博客-CSDN博客 一本通1641[例 1]矩阵 A× ...
- 《信息学奥赛一本通提高篇》第6章 组合数学
例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...
- 《信息学奥赛一本通 提高篇》
提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1章 贪心算法_青少年趣味编程-CSDN博客 提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1 ...
- 信息学奥赛一本通 提高篇 第一部分 基础算法 第2章 二分与三分
信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分 信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分_mrcrack的博客-CSDN博客_信息学奥赛一本通 ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题
第1章 快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章 素数 第 3 章 约数 第 4 章 同余问题 第 5 章 矩阵乘法 第 6 章 ...
- 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC
http://ybt.ssoier.cn:8088/show_source.php?runid=14630195 /* 信息学奥赛一本通 1080:余数相同问题 2022.1.29 AC http:/ ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂
信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂 https://blog.csdn.net/mrcrack/article/details/82846727 快速幂取模算法如何实现? h ...
- 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02
/* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...
最新文章
- R语言ggplot2可视化:使用pracma包的interp1函数对缺失值进行线性插值后进行可视化分析、用虚线标记进行数据填充的区域
- bash参数及运算练习
- Java-所有类型的Class对象
- android+使用bmob冲突,bmob开发android遇到的问题
- python内置方法怎么使用_python中的常用内置方法
- 一个程序员的爱情和他的小棉袄
- 刀塔霸业android如何更新_战斗麻将!V社自走棋《刀塔霸业》APP端上线了
- 程序员微信头像_哪些微信头像一看就是程序员?
- 123f是什么c语言,123RF博客
- 物联网服务器Domoticz自带的消息推送到QQ邮箱
- CSDN:LaTex数学公式编辑基础
- Pathon 连接数据库
- WIN32API串口接收数据简单测试
- python的学习记录
- 技术人在互联网如何变现
- 【独行秀才】macOS Monterey 12.2.1正式版(21D62)原版镜像
- 中国最低调的河,长约1000公里,却养育了上亿人口
- 国内外云主机,美国主机,香港主机,日本主机,韩国主机,选择使用与对比
- 关于淘宝 TOP 开发 使用的一些心得,问题不断更新中。。。
- 开源网安受邀参加2023澳门万讯论坛,引领软件安全领域国产化替代浪潮