luogu1341

思路

欧拉回路和欧拉路的裸题,首先判断是否存在欧拉路或者欧拉回路。当且仅当途中每个点的度数都为偶数时,存在欧拉回路。当且仅当图中度数为奇数的点的个数为2时,存在欧拉路。如果存在欧拉回路,就可以找一个最小的点开始dfs。如果存在欧拉路,那就只能从度数为奇数的两个点中更小的那个开始dfs。

欧拉回路的dfs过程大概就是一边删边,一边dfs。

如图,dfs的过程大概就是

1-2

2-3

3-6

6-5

5-4

4-1

1入队,返回

4入队,返回

5入队,返回

6-7

7-9

8-10

10-11

11-9

9-6

6入队,返回

9入队,返回

11入队,返回

10入队,返回

8入队,返回

7入队,返回

6入队,返回

3入队,返回

2入队,返回

1入队,结束

此时队列中刚是(1-4-5-6-9-11-10-8-7-6-3-2-1),就是一个合法的欧拉回路了。因为题目中要求按照字典序最小输出序列,所以每次搜索的时候先搜索字典序小的。然后将队列倒序输出才可以。

因为要按字典序从小到大搜索,所以邻接表似乎就有点麻烦了。所以直接用邻接矩阵。

代码

#include<cstdio>
#include<iostream>
using namespace std;
const int N = 1000;
int du[N],e[N][N],ji[N],ans[N*10],ansjs;
char c[5];
void dfs(int u) {
for(int i = 'A';i <= 'z';++i) {
if(!e[u][i]) continue;
e[u][i]--;
e[i][u]--;
dfs(i);
}
ans[++ansjs]=u;
}
int main() {
// freopen("text.in","r",stdin);
int n;
scanf("%d",&n);
for(int i = 1;i <= n;++i) {
scanf("%s",c+1);
e[int(c[1])][int(c[2])]++;
e[int(c[2])][int(c[1])]++;
du[int(c[1])]++;
du[int(c[2])]++;
}
int js=0;
for(int i = 'A';i <= 'z';++i) if(du[i]&1) ji[++js]=i;
if(js != 0 && js != 2) {
puts("No Solution");
return 0;
}
int s=1000;
for(int i = 'A';i <= 'z';++i) {
if(!du[i]) continue;
if(js == 0) s=min(s,i);
else if(du[i]&1) s=min(s,i);
}
dfs(s);
for(int i = ansjs;i >= 1;--i)
printf("%c",ans[i]);
return 0;
}

[luogu1341][无序字母对]的更多相关文章

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

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

  2. [Luogu1341]无序字母对(欧拉回路)

    按题意给定字符串建无向图,找欧拉回路 按照定义,当没有奇数度点或者只有2个奇数度点时才有欧拉回路 Code #include <cstdio> #include <algorithm ...

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

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

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

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

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

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

  6. P1341 无序字母对

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

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

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

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

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

  9. 无序字母对 character

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

随机推荐

  1. git客户端下载 和安装

    网址  https://git-scm.com/download/win 点击next 说明: (1)图标组件(Addition icons) : 选择是否创建桌面快捷方式. (2)桌面浏览(Wind ...

  2. scala下划线

    作为函数的参数 一个匿名的函数传递给一个方法或者函数的时候,scala会尽量推断出参数类型.例如一个完整的匿名函数作为参数可以写为 scala> def compute(f: (Double)= ...

  3. Could not render e, see the console.

    错误截图: 解决: 在application.properties中开启swagger swagger2.enable=true

  4. python安装与配置

    首先下载python地址: https://www.python.org/downloads/release/python-361/ 下载页面中有多个版本: web-based installer 是 ...

  5. Python包的相对导入时出现问题解决

    资料参考: https://www.cnblogs.com/ArsenalfanInECNU/p/5346751.html 在python导入包,如下: from .units import * 经常 ...

  6. Windows & RabbitMQ:Shovel

    RabbitMQ的集群和高可用不适合跨域的情况,如果跨域可以使用Shovel或Federation. 描述:我们需要配置三台服务器:ServerA, ServerB, ServerC Step 1:安 ...

  7. Android组件化、模块化、插件化

    组件:指的是单一的功能组件,如地图组件(MapSDK).扫码组件(QRCode).支付组件(AnjukePay).路由组件(Router)等等: 模块:指的是独立的业务模块,如新房模块(NewHous ...

  8. .net core 2.0 配置Session

    本文章为原创文章,转载请注明出处 配置Session 在Startup.cs文件的ConfigureServices方法中添加session services.AddSession(); 在Start ...

  9. BZOJ1823[JSOI2010]满汉全席——2-SAT+tarjan缩点

    题目描述 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过 ...

  10. 洛谷P1462通往奥格瑞玛的道路题解

    [题目]: https://www.luogu.org/problemnew/show/P1462 题意 题目是给定了一张双向边,有边权的图,然后让我们求出一个最小值,满足一条路径上的最大的费用小于这 ...