Luogu 1341 无序字母对 - 欧拉路径

Solution

找一条字典序最小的欧拉路径。

用 $multiset$ 存储领接表。

欧拉路径模板传送门

Code

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<set>
 5 using namespace std;
 6
 7 const int N = 1e3 + 5;
 8
 9 int n, up = ‘z‘ - ‘A‘ + 1;
10 int ans[N], tot, d[N], num;
11
12 multiset<int> to[N];
13
14 void dfs(int u) {
15     multiset<int> :: iterator i;
16     for (i = to[u].begin(); i != to[u].end(); i = to[u].begin()) {
17         int nt = *i;
18         to[nt].erase(to[nt].find(u));
19         to[u].erase(to[u].find(nt));
20         dfs(nt);
21     }
22     ans[++tot] = u;
23 }
24
25 int main()
26 {
27     scanf("%d", &n);
28     for (int i = 1; i <= n; ++i) {
29         char s[3];
30         scanf("%s", s);
31         to[s[0] - ‘A‘ + 1].insert(s[1] - ‘A‘ + 1);
32         to[s[1] - ‘A‘ + 1].insert(s[0] - ‘A‘ + 1);
33         d[s[1] - ‘A‘ + 1]++;
34         d[s[0] - ‘A‘ + 1]++;
35     }
36     for (int i = 1; i <= up; ++i)
37         if (d[i] & 1)
38             num++;
39     if (num == 1 || num > 2)
40         return puts("No Solution"), 0;
41     if (num == 0) {
42         for (int i = 1; i <= up; ++i)
43             if (d[i]) {dfs(i); break;}
44     }
45     else
46         for (int i = 1; i <= up; ++i)
47             if (d[i] && (d[i] & 1)) {dfs(i); break;}
48     for (int i = tot; i; i--)
49         putchar(ans[i] + ‘A‘ - 1);
50     puts("");
51 }

原文地址:https://www.cnblogs.com/cychester/p/9729075.html

时间: 2024-09-30 06:26:25

Luogu 1341 无序字母对 - 欧拉路径的相关文章

洛谷1341 无序字母对

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

1341 无序字母对

难度:提高+/省选- 题目类型:图论 提交次数:6 涉及知识:dfs/欧拉路径 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出"No Solution". 如果有多种方案,请输出前面的字母的ASCII编码尽

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数组

无序字母对(luogu 1314)

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

无序字母对

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

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

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

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

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

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

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

「LuoguP1341」 无序字母对(欧拉回路

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