[欧拉回路]无序字母对

无序字母对

题目描述

给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。

输入

第一行输入一个正整数n。

以下n行每行两个字母,表示这两个字母需要相邻。

输出

输出满足要求的字符串。

如果没有满足要求的字符串,请输出“No Solution”。

如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案

样例输入

4
aZ
tZ
Xt
aX

样例输出

XaZtX

提示

【数据规模与约定】

n<=1326

代码:

 1 #include<cstdio>
 2 #define H 0x6ffffff
 3 int n, c = 0, map[60][60], d[60], ans[2000], s = H, ss = H, x, y, v, t = 0;
 4 char z[3];
 5 
 6 int turn(char c){
 7     return c - 'A' + 1;
 8 }
 9 
10 char nrut(int a){
11     return a + 'A' - 1;
12 }
13 
14 void dfs(int i) { 
15     for (int j = 1; j <= v; j++) {
16           if(map[i][j]>0){
17             map[i][j]--;
18             map[j][i]--;
19             dfs(j);
20           }
21     }
22     ans[++c] = i;
23 }
24 
25 int main() {
26     scanf("%d", &n);
27     for (int i = 1; i <= n; i++){
28           scanf("%s", z + 1);
29           x = turn(z[1]);
30         y = turn(z[2]);
31           map[x][y]++;
32           map[y][x]++;
33           d[x]++;
34         d[y]++;
35           if (x > v) {
36             v = x;
37         }
38           if (y > v) {
39             v = y;
40         }
41     }
42     for (int i = 1; i <= v; i++) {
43           if(d[i] % 2 == 1) {
44             if(s == H) {
45                 s = i;
46             }
47             t++;
48           }
49           if (d[i] > 0 && ss == H) {
50             ss = i;
51         }
52     }
53     if (t != 0 && t != 2) {
54           printf("No Solution");
55           return 0;
56     }
57     if (s == H) {
58         dfs(ss);
59     }
60     else {
61         dfs(s);
62     }
63     if (c - 1 != n) {
64         printf("No Solution");
65     }
66     else {
67           for (int i = c; i >= 1; i--) {
68             printf("%c", nrut(ans[i]));
69         }
70     }
71     return 0;
72 }
原文地址:https://www.cnblogs.com/GldHkkowo/p/8846553.html