[luogu1341][无序字母对]
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][无序字母对]的更多相关文章
- [luogu1341]无序字母对【欧拉回路】
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 分析 欧拉回路的模板题. 暴力删边欧拉 ...
- [Luogu1341]无序字母对(欧拉回路)
按题意给定字符串建无向图,找欧拉回路 按照定义,当没有奇数度点或者只有2个奇数度点时才有欧拉回路 Code #include <cstdio> #include <algorithm ...
- 洛谷P1341 无序字母对[无向图欧拉路]
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- 洛谷 P1341 无序字母对 Label:欧拉路 一笔画
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- P1341 无序字母对 欧拉回路
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- P1341 无序字母对
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- 【洛谷P1341】无序字母对
题目大意:给定 n 个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有 n+1 个字母的字符串使得每个字母对都在这个字符串中出现. 题解:每个无需字母对可以看成无 ...
- 洛谷 P1341 无序字母对 解题报告
P1341 无序字母对 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 ...
- 无序字母对 character
无序字母对 character 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入 ...
随机推荐
- 校园电商项目(1) 基于SSM
第一步:搭好环境 我这里使用Eclipse做本次的项目,tomcat.maven啥的怎么弄就跳过了ヾ(o・ω・)ノ 第二步:创建工程 我们首先创建一个maven项目,选择最后一个,创建完之后发现报错, ...
- Linux基础操作二
编程语言的作用及与操作系统和硬件的关系 编程语言的作用:用来定义计算机程序的形式,程序员用它来编写程序,进而控制其向计算机发出指令,使计算机完成人类布置的任务. 编程语言的作用及与操作系统和硬件的关系 ...
- vue中的适配:px2rem
这应该是vue项目在适配移动端时候,最简单的方法之一下面是基本步骤(使用cnpm)1.下载并引入lib-flexible cnpm install --save lib-flexible 在main. ...
- js中的arguments
了解这个对象之前先来认识一下javascript的一些功能: 其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载.Javascrip中国每个函数都会有一个Argume ...
- Python 基础知识----流程控制
判断语句 循环语句 嵌套
- Java8新特性之Collectors
参考:Java8新特性之Collectors 在第二天,你已经学习了Stream API能够让你以声明式的方式帮助你处理集合.我们看到collect是一个将管道流的结果集到一个list中的结束操作.c ...
- Hibernate **关于hibernate4.3版本之后org.hibernate.service.ServiceRegistryBuilder被弃用**
之前一直都是使用hibernate4.2.21的我,有一天突然没有使用本地的jar包而是让IDEA自动下载最新版本的hibernate5.2.2之后,发现有几个经常使用的方法报错了. //创建配置对象 ...
- excel 公式 insert 语句
="insert into tb_fdn_deviceaccount (zdmc,czmc,sbbh,sbmc,SZCS,SBFLMC,SBLXMC,SBGG,SBYZ,SBJZ,SBXH, ...
- asp.net—WebApi跨域
一.什么是跨域? 定义:是指浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制. 同源策略限制了以下行为: 1.Cookie.LocalStora ...
- IDEA下载依赖时提示 resolving dependencies of xxx, yyy
IDEA下载依赖时提示 resolving dependencies of xxx, yyy ,卡住不动 使用Maven命令可以更清楚地分析问题,在IDEA命令行窗口执行mvn compile命令,提 ...