欧拉回路【洛谷习题】无序字母对
首先非常痛心疾首地说一句,欧拉回路自己之前只是看过代码,知道思想,从来没有亲手实现过,所以,,,伤亡惨重!!!
欧拉回路是一个非常有意思的图论模型,因为伟大的数学家欧拉(euler)而得名。传说,曾经人们沉迷于一个七桥问题,想找出一种走法不重复地经过七座桥(具体请自行了解)。欧拉指出了不存在这样的走法,并由此归结出了“一笔画问题”。用图论的语言来说,就是找一条路径不重复地走过所有的边。
实际上,从一个点出发,不重复地经过所有的边,这叫做欧拉道路;如果这条路径起点和终点相同,才称为欧拉回路。另外,如果一个图存在欧拉道路,那么称为半欧拉图,如果一个图存在欧拉回路,称为欧拉图。
对于无向图,存在欧拉道路的条件是只有两个或不存在奇点(度为奇数的点),存在欧拉回路的条件是不存在奇点。对于有向图,存在欧拉道路的条件是只有两个点的入度和出度不相同,并且其中一个点(起点)的出度比入度大1,另一个点(终点)的入度比出度大1,或者所有点的入度和出度都相等,存在欧拉回路的条件是所有点的入度和出度都相等。当然图必须是连通的。
寻找欧拉道路或者欧拉回路是比较简单的,可以使用DFS。起点的确定也需要注意,如果找欧拉道路,必须找到相应的起点,而欧拉回路任选一个点作为起点即可。
1 void euler(int u) { 2 for(int v=1;v<=n;++v) 3 if(G[u][v]) { 4 G[u][v]=G[v][u]=0; //有向图则改为G[u][v]=0; 5 euler(v); 6 } 7 ans.push(u); 8 }
寻找欧拉道路或欧拉回路(无向图)
需要注意的是,我们此处标记的是边(或者删除边)。因为欧拉道路或欧拉回路是可以一口气走到结束的,所以上面的代码可以放心写个循环,且递归后不必跳出,因为当返回该点时,该点所连的其他边必然已经被走过了。因此答案里存的就是一条完整的路径。还有需要注意要先进行DFS遍历,最后存储答案,这叫做套圈法,可以处理环相连的情况。
无序字母对:https://www.luogu.org/problemnew/show/P1341
这道题的话,还是浪费了很多时间,一是因为欧拉回路以前没写过,而是因为这道题答案保存那里有点玄学问题,默默改成栈就过了(其实是因为无语的数组溢出,导致了奇怪的输出)。字符的处理也需要注意一下。如果直接读入到字符数组会WA的很惨。别问我是怎么知道的。。。
1 #include <cstdio> 2 #include <stack> 3 4 using namespace std; 5 6 const int maxa = 55; 7 8 inline int toInt(char c) { 9 if (c <= 'Z') return c - 'A' + 1; 10 else return c - 'a' + 27; 11 } 12 13 inline char toChar(int i) { 14 if (i <= 26) return i - 1 + 'A'; 15 else return i - 27 + 'a'; 16 } 17 18 int G[maxa][maxa], degree[maxa]; 19 20 stack<int> ans; 21 22 void euler(int u) { 23 for (int v = 1; v <= 52; ++v) 24 if (G[u][v]) { 25 G[u][v] = G[v][u] = 0; 26 euler(v); 27 } 28 ans.push(u); 29 } 30 31 int main() { 32 int n, a, b, s1 = 0, s2 = 0, cnt = 0; 33 scanf("%d", &n); 34 for (int i = 1; i <= n; ++i) { 35 char u = getchar(); 36 while (u == '\n' || u == ' ' || u == '\r') 37 u = getchar(); 38 char v = getchar(); 39 a = toInt(u), b = toInt(v); 40 G[a][b] = G[b][a] = 1; 41 ++degree[a], ++degree[b]; 42 } 43 for (int i = 1; i <= 52; ++i) { 44 if (degree[i] && !s1) s1 = i; 45 if (degree[i] % 2) { 46 ++cnt; 47 if (!s2) s2 = i; 48 } 49 } 50 if (cnt && cnt != 2) printf("No Solution"); 51 else { 52 if (cnt) euler(s2); 53 else euler(s1); 54 if ((int)ans.size() != n + 1) printf("No Solution"); 55 else while (!ans.empty()) { 56 printf("%c", toChar(ans.top())); 57 ans.pop(); 58 } 59 } 60 return 0; 61 }
AC代码
转载于:https://www.cnblogs.com/Mr94Kevin/p/9532164.html
欧拉回路【洛谷习题】无序字母对相关推荐
- 洛谷 1341 无序字母对
欧拉路的裸题??? 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #inc ...
- [洛谷P1341]无序字母对
题目大意:给一张无向图,找一条字典序最小的欧拉路径 题解:若图不连通或有两个以上的奇数点,则没有欧拉路径,可以$dfs$,在回溯时把这个节点加入答案 卡点:没有在回溯时加入答案,导致出现了欧拉路径没走 ...
- 洛古--P1341 无序字母对--欧拉路径--Sabrina--Sabrinadol
题目网站 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第 ...
- 【洛谷习题】南蛮图腾
题目链接:https://www.luogu.org/problemnew/show/P1498 不好实现... 这道题在洛谷的分类是分治,我用的方法就是分治,不过却刷新的我对分治的认识.以前见过的分 ...
- 【洛谷习题】小A点菜
虽然也是一道dp的入门题,但就是想不到,或者说不会实现.dp还是要多做题. 链接:https://www.luogu.org/problemnew/show/P1164 我们可以设dp[i][j]表示 ...
- 【洛谷习题】填涂颜色
题目链接:https://www.luogu.org/problemnew/show/P1162 好久没写博客了,这次一写竟是道搜索模板题.可见我水平下降很快... 这道题虽然简单,但细节颇多,需要注 ...
- 【洛谷习题】尼克的任务
坑! 题目链接:https://www.luogu.org/problemnew/show/P1280 哎呀呀,好好的一道DP题,太伤心了... 思路很快有了,可以定义dp[i]为以第i个任务为结尾的 ...
- 【洛谷习题】又是毕业季II
题目链接:https://www.luogu.org/problemnew/show/P1414 一开始看到的时候觉得很难,和之前的又是毕业季I相比确实更难了. 仔细做做,发现思路还是可以的,因为in ...
- 【洛谷习题】通往奥格瑞玛的道路
题目的描述就很有意思,可以顺便去了解一下魔兽的背景故事.学习使我们快乐! 题目链接:https://www.luogu.org/problemnew/show/P1462 大清早上起来A掉一道题,好兴 ...
最新文章
- 【机器学习入门到精通系列】机器学习系统设计(Precision Recall)
- 1.我和python的第一次亲密接触
- SDUT 1265-马停下过河卒(DFS)
- 简单的线程同步问题:两个线程交替执行N次【Synchronized、Lock、ArrayBlockingQueue】...
- Thread was being aborted.(调试或执行较长时间的程序时发生的错误)
- Firefox浏览Flash网页乱码的解决方案
- 实验十四:雨滴传感器实验
- APP 性能测试工具
- Spring框架学习笔记6-AOP编程-AspectJ方式
- 打蚊子表情包_打死蚊子表情包 - 打死蚊子微信表情包 - 打死蚊子QQ表情包 - 发表情 fabiaoqing.com...
- 一年读了八十本书之后,我推荐这五本给你
- 51单片机数码管密码锁
- VB 清除数组中全部元素的值
- 魅族M9同步谷歌联系人
- python控制台打印文字logo
- 语音验证码接收平台接口调用文档
- python 英语翻译_用Python将日语翻译成英语
- c语言总结试题,C语言试题总结
- Kafka快速入门(Kafka消费者)
- 复制对象clone(深复制和浅复制)
热门文章
- 补充 宝玉 之《URL欺骗之以假乱真!》之 POST 方法提交数据 之 处理!
- 写一下这两天的生活吧!开学了,也没有多少时间了
- 计算机组成原理课程内容,计算机组成原理课程教学大纲.doc.doc
- Photo Pos Pro 3中文版
- proDAD Erazr便携版
- 让一个 csproj 项目指定多个开发框架
- According to TLD or attribute directive in tag file, attribute value does not accept any expressions
- [na]vrrp两用(网关冗余+服务器热备)
- ASP实现单条件和多条件组合查询的实例
- 认识一下Global.asa 文件