Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

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

【输入格式】

第一行输入一个正整数n。 以下n行每行两个字母,表示这两个字母需要相邻。

【输出格式】

输出满足要求的字符串。 如果没有满足要求的字符串,请输出“No Solution”。 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案

【数据规模】

Sample Input1

4
aZ
tZ
Xt
aX

Sample Output1

XaZtX

【样例说明】

不同的无序字母对个数有限,n的规模可以通过计算得到。
【题解】
把两个字母看做边的两端点。则所输入的n个字母对就是n条边。所求的字符串就是这n条边构成的图的欧拉路径。这里说的n+1个字符。如果它不是一条链。则一定是存在一个环的。

然后用存在欧拉路的定理先判定会不会有欧拉路;
即统计所有点的出度的奇偶个数。
如果奇数的出度数总数为0(全是偶数)或2.则存在欧拉路。
如果全是偶数。就从字典序最小的一个点开始dfs找就可以。
如果有两个奇数的点。就从字典序较小的那个奇数点开始dfs。
是一定能找到的。链的情况也可以包括。

其他情况都可以用欧拉图定理排除掉。
【代码】
#include <cstdio>
#include <stdlib.h> int a[256][256] = { 0 }, n, w[256][256] = { 0 },chudu[256];
char temp[256]; void dfs(int x, int now)//现在到达x顶点。下一个点是第now个点
{
if (now == n + 2)//如果已经找到第n+1个点了。
{
for (int i = 1; i <= n + 1; i++)//则输出之前记录的路径
putchar(temp[i]);
exit(0);//直接结束所有的程序。
}
for (int i = 1;i<= 255;i++)//寻找x的出度。并记录这个出度
if (w[x][i] == 1)
{
w[x][i] = 0;
w[i][x] = 0;//反向边也要置0.不然又会往回走。
temp[now] = i;//记录路径
dfs(i, now + 1);//继续搜索。
w[x][i] = 1;
w[i][x] = 1;
}
} int main()
{
scanf("%d", &n);//输入n条边
for (int i = 1; i <= n; i++)
{
char s[10];
scanf("%s", s);//以字符串的形式输入。
int x = s[0], y = s[1];//获取两个端点
if (w[x][y] == 0)//如果没有重边
{
w[x][y] = 1;//记录边
w[y][x] = 1;
a[x][0]++;//记录其第a[x][0]个出度是什么
a[x][a[x][0]] = y;
a[y][a[y][0]] = x;
chudu[x]++;//相应的出度递增。
chudu[y]++;
}
}
int jishu = 0,start = 0;//统计奇数出度的个数。以及从哪里开始进行dfs.
for (int i = 1; i <= 255; i++)
{
if (chudu[i] > 0 && start == 0)//找到一个字典序最小的有出度的点。开始
start = i;
if ((chudu[i] % 2) == 1)//如果有奇数点。就从奇数点里面字典序最小的开始。
{
if (jishu == 0)
start = i;
jishu++;
}
}
if (jishu != 0 && jishu != 2)//如果不全为偶数且奇数点的个数不为2.则输出无解信息。
{
printf("No Solution");
return 0;
}
temp[1] = start;//否则从开始点开始搜寻欧拉路径 记录路径。
dfs(start,2);
return 0;
}

【u016】无序字母对的更多相关文章

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

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

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

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

  3. P1341 无序字母对 欧拉回路

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

  4. [luogu1341]无序字母对【欧拉回路】

    题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 分析 欧拉回路的模板题. 暴力删边欧拉 ...

  5. P1341 无序字母对

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

  6. 【洛谷P1341】无序字母对

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

  7. 洛谷 P1341 无序字母对 解题报告

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

  8. 无序字母对 character

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

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

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

随机推荐

  1. IIS发布asp.net mvc项目(asp.net core也是一样)

    因为之前都是利用其他的工具在linux上面进行发布,导致现在忘记了在IIS上面怎么发布,现在就记录下来,以防不时之需吧 第一步: 在vs里面进行项目发布:指定好发布的位置,点击发布就好了 第二步:右击 ...

  2. linux创建新用户并给予root权限

    root比windows的系统管理员的能力更大,足以把整个系统的大部分文件删掉,导致系统完全毁坏,不能再次使用.所以,用root进行不当的操作是相当危险的,轻微的可以死机,严重的甚至不能开机.所以,在 ...

  3. 洛谷 P1916 小书童——蚂蚁大战

    P1916 小书童——蚂蚁大战 题目背景 小A在你的帮助下,开始“刷题”,他在小书童里发现了一款叫“蚂蚁大战”(又称蛋糕保卫战)的游戏.(你懂得) 题目描述 游戏中会出现n只蚂蚁,分别有a1,a2…… ...

  4. progerssbar-style 属性分析

    先看如下代码 <ProgressBar android:id="@+id/stateProgressBar" android:orientation="horizo ...

  5. js课程 6-15 js简单弹力球如何实现

    js课程 6-15 js简单弹力球如何实现 一.总结 一句话总结:a.通过document的documentElement属性获取可是区域的高: b.通过增值变为负的实现到底部后反弹 1.docume ...

  6. 1.1 Introduction中 Kafka for Stream Processing官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Kafka for Stream Processing kafka的流处理 It i ...

  7. 01011_怎么打开任务管理器?win7打开任务管理器方法

    以下几种方法可以打开任务管理器 1.在系统的任务栏点击鼠标右键,然后在弹出的右键菜单中选择“启动任务管理器”: 2.同时按下这三个按钮:Ctrl + Shift + Esc: 3.同时按下键盘的Ctr ...

  8. 【例题 7-13 UVA-1374】Power Calculus

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 结论:每次只用新生成的数字就好了. 然后就是IDA*了. 迭代深搜+剪枝. [代码] /* 1.Shoud it use long ...

  9. Java基础学习总结(38)——Lombok的使用和原理

    一.项目背景 在写Java程序的时候经常会遇到如下情形:  新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法  lombok项目的产生就是为 ...

  10. 【hdu 1403】Longest Common Substring

    [链接]h在这里写链接 [题意] 求两个串的最长公共子串. [题解] Sa[i]表示的是字典序为i的后缀的起始位置. 可以把两个字符串合在一起(中间用一个比'z'大的字符分割); 则如果Sa[i-1] ...