首先非常痛心疾首地说一句,欧拉回路自己之前只是看过代码,知道思想,从来没有亲手实现过,所以,,,伤亡惨重!!!

欧拉回路是一个非常有意思的图论模型,因为伟大的数学家欧拉(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

欧拉回路【洛谷习题】无序字母对相关推荐

  1. 洛谷 1341 无序字母对

    欧拉路的裸题??? 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #inc ...

  2. [洛谷P1341]无序字母对

    题目大意:给一张无向图,找一条字典序最小的欧拉路径 题解:若图不连通或有两个以上的奇数点,则没有欧拉路径,可以$dfs$,在回溯时把这个节点加入答案 卡点:没有在回溯时加入答案,导致出现了欧拉路径没走 ...

  3. 洛古--P1341 无序字母对--欧拉路径--Sabrina--Sabrinadol

    题目网站 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第 ...

  4. 【洛谷习题】南蛮图腾

    题目链接:https://www.luogu.org/problemnew/show/P1498 不好实现... 这道题在洛谷的分类是分治,我用的方法就是分治,不过却刷新的我对分治的认识.以前见过的分 ...

  5. 【洛谷习题】小A点菜

    虽然也是一道dp的入门题,但就是想不到,或者说不会实现.dp还是要多做题. 链接:https://www.luogu.org/problemnew/show/P1164 我们可以设dp[i][j]表示 ...

  6. 【洛谷习题】填涂颜色

    题目链接:https://www.luogu.org/problemnew/show/P1162 好久没写博客了,这次一写竟是道搜索模板题.可见我水平下降很快... 这道题虽然简单,但细节颇多,需要注 ...

  7. 【洛谷习题】尼克的任务

    坑! 题目链接:https://www.luogu.org/problemnew/show/P1280 哎呀呀,好好的一道DP题,太伤心了... 思路很快有了,可以定义dp[i]为以第i个任务为结尾的 ...

  8. 【洛谷习题】又是毕业季II

    题目链接:https://www.luogu.org/problemnew/show/P1414 一开始看到的时候觉得很难,和之前的又是毕业季I相比确实更难了. 仔细做做,发现思路还是可以的,因为in ...

  9. 【洛谷习题】通往奥格瑞玛的道路

    题目的描述就很有意思,可以顺便去了解一下魔兽的背景故事.学习使我们快乐! 题目链接:https://www.luogu.org/problemnew/show/P1462 大清早上起来A掉一道题,好兴 ...

最新文章

  1. 【机器学习入门到精通系列】机器学习系统设计(Precision Recall)
  2. 1.我和python的第一次亲密接触
  3. SDUT 1265-马停下过河卒(DFS)
  4. 简单的线程同步问题:两个线程交替执行N次【Synchronized、Lock、ArrayBlockingQueue】...
  5. Thread was being aborted.(调试或执行较长时间的程序时发生的错误)
  6. Firefox浏览Flash网页乱码的解决方案
  7. 实验十四:雨滴传感器实验
  8. APP 性能测试工具
  9. Spring框架学习笔记6-AOP编程-AspectJ方式
  10. 打蚊子表情包_打死蚊子表情包 - 打死蚊子微信表情包 - 打死蚊子QQ表情包 - 发表情 fabiaoqing.com...
  11. 一年读了八十本书之后,我推荐这五本给你
  12. 51单片机数码管密码锁
  13. VB 清除数组中全部元素的值
  14. 魅族M9同步谷歌联系人
  15. python控制台打印文字logo
  16. 语音验证码接收平台接口调用文档
  17. python 英语翻译_用Python将日语翻译成英语
  18. c语言总结试题,C语言试题总结
  19. Kafka快速入门(Kafka消费者)
  20. 复制对象clone(深复制和浅复制)

热门文章

  1. 补充 宝玉 之《URL欺骗之以假乱真!》之 POST 方法提交数据 之 处理!
  2. 写一下这两天的生活吧!开学了,也没有多少时间了
  3. 计算机组成原理课程内容,计算机组成原理课程教学大纲.doc.doc
  4. Photo Pos Pro 3中文版
  5. proDAD Erazr便携版
  6. 让一个 csproj 项目指定多个开发框架
  7. According to TLD or attribute directive in tag file, attribute value does not accept any expressions
  8. [na]vrrp两用(网关冗余+服务器热备)
  9. ASP实现单条件和多条件组合查询的实例
  10. 认识一下Global.asa 文件