[P1341]无序字母对 (欧拉回路)

我永远信仰欧拉

欧拉回路是很经典的一道题目了

这题算是稍稍修改的模板题吧

欢迎指出错误

题目链接

思路

先判断能不能构成欧拉路径/回路

即度数为1的总点数为2或0的时候符合(前者为连通图,后者为回路)

这题是回路吧

如果不可以,结束

如果可以,dfs搜索路径(貌似搜索路径还有模板来着)

代码

代码短,我就不压了

 1 #include<bits/stdc++.h>
 2 #define maxn 257
 3 bool G[maxn][maxn];
 4 int deg[maxn];
 5 char tmp[maxn],res[maxn * maxn];
 6 int n;
 7 void dfs(int i) {
 8     for (int j = 0; j < maxn; j++) {
 9         if (G[i][j]) {
10             G[i][j] = G[j][i] = 0;
11             dfs(j);
12         }
13     }
14     res[n--] = i;
15 }
16 int main()
17 {
18     scanf("%d", &n);
19     for (int i = 0; i < n; i++) {
20         scanf("%s", tmp);
21         G[tmp[0]][tmp[1]] = G[tmp[1]][tmp[0]] = 1;
22         deg[tmp[0]]++;
23         deg[tmp[1]]++;
24     }
25     char fir = 0, cnt = 0;
26     for (int i = 0; i < maxn; i++) {
27         if (deg[i] & 1) {
28             cnt++;
29             if (!fir) fir = i;
30         }
31     }
32     if (!fir) for (int i = 0; i < maxn; i++) if (deg[i]) { fir = i; break; }
33     if (cnt && cnt != 2) return puts("No Solution"), 0;
34     dfs(fir);
35     puts(res);
36 }

原文地址:https://www.cnblogs.com/fsy2017/p/9863838.html

时间: 2024-11-13 03:52:42

[P1341]无序字母对 (欧拉回路)的相关文章

洛谷P1341 无序字母对(欧拉回路)

P1341 无序字母对 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出“No Solution”. 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 输入输出样例 输入样例#1: 4 a

luogu P1341 无序字母对

P1341 无序字母对 直通 思路: 欧拉回路问题 坑点: ①第三个点出现了 5 ab ac ad ae af 这样的情况 所以我们需要加一点小优化: for(int i=0; i<=top; i++) { //特判第三个点... if(i==0) continue; if(!tmp[ans[i]][ans[i-1]]) { printf("No Solution"); return 0; } } ②我们还需要保证题目中给出的所有字母均在ans数组中出现,所以需要开2个vis数组

洛谷P1341 无序字母对

P1341 无序字母对 229通过 806提交 题目提供者yeszy 标签图论福建省历届夏令营 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 不知道哪里错 求解释 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,

P1341 无序字母对(欧拉回路)

题目链接: https://www.luogu.org/problemnew/show/P1341 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出"No Solution". 如果有多种方案,请输出前面的字

洛谷 P1341 无序字母对 Label:欧拉路 一笔画

题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出“No Solution”. 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 输入输出样例 输入样例#1: 4 aZ tZ Xt aX 输

p1341 无序字母对

传送门 题目 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出"No Solution". 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 分析 任意俩字母的相邻关系可表示为一条路径,所以在相邻字母间

洛谷P1341 无序字母对[无向图欧拉路]

题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出“No Solution”. 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 输入输出样例 输入样例#1: 4 aZ tZ Xt aX 输

P1341 无序字母对(欧拉回路+并查集)

1 //并查集判联通,dfs求解欧拉回路 2 #include<iostream> 3 using namespace std; 4 const int N=150; 5 int mp[N][N];//邻接矩阵存图 6 int d[N];//点的度数 7 char res[N*N];//大于C(52,1)*C(51,1)/2,边数 8 int n;//边数 9 void dfs(int now) 10 { 11 for(int i='A';i<='z';i++)//没什么好说的 12 {

P1341 无序字母对(Hierholzer算法判断欧拉回路)

https://www.luogu.com.cn/problem/P1341 https://blog.csdn.net/STILLxjy/article/details/51956183?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task https://blog.csdn.net/qq_37555704/article/details/83347641