[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个字母的字符串使得每个字母对都在这个字符串中出现. 输入 ...
随机推荐
- vue+webpack项目打包后背景图片加载不出来问题解决
在做VUE +的WebPack脚手架项目打包完成后,在IIS服务器上运行发现项目中的背景图片加载不出来检查项目代码发现是因为CSS文件中,背景图片引用的路径问题;后来通过修改配置文件,问题终于解决了, ...
- wireshark抓包获取好友ip,定位所在位置
1.打开wireshark 2.按Ctrl + F 键进行搜索 1,选择搜索 “字符串”; 2,选择搜索 “分组详情”; 3,填写搜索数据 “020048″; 3.对qq好友发起语言或视频通话(需要对 ...
- WPF中关于对前台Xaml中Triggers的一些重要思考。
今天在做一个小Demo的时候碰到了一个比较奇怪的问题,就是其中一个Trigger始终无法执行,<Trigger Property="Popup.IsOpen" Value=& ...
- jaxp的dom方式操作(查找、添加、修改、删除、遍历节点)
package cn.itcast.jaxptest; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;imp ...
- MySQL in型子查询陷阱
现在有两个表,table1和table2,table1有1千万数据(id 主键索引),table2有三条数据(uid字段 3,5,7): select * from table1 where id i ...
- vhdl——type
TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型 TYPE 数据类型名 IS 数据类型定义 常用的用户自定义的数据类型有枚举型,数组型,记录型.其中枚举型的在状态机的描述中经常使用到 ,数 ...
- codeforces493B
Vasya and Wrestling CodeForces - 493B Vasya has become interested in wrestling. In wrestling wrestle ...
- SQL Server使用笔记
1.连接字符串 SQL Server 身份验证,如:"server=yqzhu-peter;database=WindWMNew1_DB;uid=sa;pwd=ABcd1234;Connec ...
- Ubuntu16.04安装使用wps
Ubuntu16.04安装使用wps 1.wps官网下载并安装wps 此处以Debian安装包为例,官网下载路径 http://www.wps.cn/product/wpslinux/# 直接安装: ...
- Codeforces Round #424 Div. 1
A:二分答案,从左往右考虑每个人,选尽量靠左的钥匙即可. #include<iostream> #include<cstdio> #include<cmath> # ...