P1341 无序字母对【欧拉路径】- Hierholzer模板
P1341 无序字母对
推荐题目
题目描述
给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。
输入格式
第一行输入一个正整数n。
以下n行每行两个字母,表示这两个字母需要相邻。
输出格式
输出满足要求的字符串。
如果没有满足要求的字符串,请输出“No Solution”。
如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案
输入输出样例
4 aZ tZ Xt aX
XaZtX
说明/提示
【数据规模与约定】
不同的无序字母对个数有限,n的规模可以通过计算得到。
思路
把字母相连看作连边,对整张图来说,每个字母对出现 = 可以找到一个欧拉路径/回路,所以只要先判断图是否连通,即判断是否该点:其度不为0且祖先是它本身。
对于一张连通图来说,只要判断它是否能形成欧拉路径/回路即可,也就是有且只有两个度为奇数的点或全部的点度为偶数。
如果可以形成欧拉路径/回路,就找一个度不为0的点作为起点套Hierholzer算法模板;
Hierholzer算法存答案时需要反向存,这样做的好处是保证了无路可走时存下来的答案一定是欧拉路径的终点。
CODE
#include <bits/stdc++.h>
#define dbg(x) cout << #x << "=" << x << endl
#define eps 1e-8
#define pi acos(-1.0) using namespace std;
typedef long long LL; template<class T>inline void read(T &res)
{
char c;T flag=;
while((c=getchar())<''||c>'')if(c=='-')flag=-;res=c-'';
while((c=getchar())>=''&&c<='')res=res*+c-'';res*=flag;
} namespace _buff {
const size_t BUFF = << ;
char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
char getc() {
if (ib == ie) {
ib = ibuf;
ie = ibuf + fread(ibuf, , BUFF, stdin);
}
return ib == ie ? - : *ib++;
}
} int qread() {
using namespace _buff;
int ret = ;
bool pos = true;
char c = getc();
for (; (c < '' || c > '') && c != '-'; c = getc()) {
assert(~c);
}
if (c == '-') {
pos = false;
c = getc();
}
for (; c >= '' && c <= ''; c = getc()) {
ret = (ret << ) + (ret << ) + (c ^ );
}
return pos ? ret : -ret;
} const int maxn = ; int n; int edge[maxn][maxn];
int deg[maxn], fa[maxn];//出入度
char ans[maxn*maxn]; stack <char> s; int fid(int x) {
return x == fa[x] ? x : fid(fa[x]);
} void init() {
for (int i = ; i <= ; ++i) {
fa[i] = i;
}
} void dfs(int x) {
for (int i = ; i <= ; ++i) {
if(edge[x][i]) {
edge[x][i] = edge[i][x] = ;
dfs(i);
}
}
ans[n--] = x;
} int main()
{
cin >> n;
char a[];
int cnt = ;
init();
for(int i = ; i <= n; i++) {
cin >> a;
edge[a[]][a[]] = edge[a[]][a[]]=;
deg[a[]]++;
deg[a[]]++;
int x = fid(a[]), y = fid(a[]);
fa[x]=y;
//printf("x:fa[%d]:%d deg[%d]:%d\n",xx,fa[xx],a[0],deg[a[0]]);
//printf("y:fa[%d]:%d deg[%d]:%d\n",yy,fa[yy],a[1],deg[a[1]]);
} for (int i = ; i <= ; ++i) { if(fa[i] == i && deg[i]) {
cnt++;
//dbg(cnt);
}
}
//dbg(cnt);
if(cnt != ) {//图不连通
puts("No Solution");
return ;
}
//dbg(cnt);
cnt = ;
int head = ;
for (int i = ; i <= ; ++i) {
if(deg[i] & ) {
cnt++;
if(!head)
head = i;
//dbg(cnt);
}
}
if(cnt && cnt != ) {
puts("No Solution");
return ;
}
if(!head) {
for (int i = ; i <= ; ++i) {
if(deg[i]) {
head = i;
break;
}
}
}
dfs(head);
cout << ans << endl;
return ;
}
P1341 无序字母对【欧拉路径】- Hierholzer模板的更多相关文章
- 洛谷P1341 无序字母对(欧拉回路)
P1341 无序字母对 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 ...
- 洛谷 P1341 无序字母对 解题报告
P1341 无序字母对 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 ...
- 洛谷 P1341 无序字母对(欧拉路)
P1341 无序字母对 题目提供者yeszy 标签 福建省历届夏令营 难度 提高+/省选- 最新讨论 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造 ...
- P1341 无序字母对(欧拉回路)
题目链接: https://www.luogu.org/problemnew/show/P1341 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一 ...
- 洛谷 P1341 无序字母对 Label:欧拉路 一笔画
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- 洛谷P1341 无序字母对[无向图欧拉路]
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- P1341 无序字母对 欧拉回路
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- P1341 无序字母对
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- P1341 无序字母对[欧拉路]
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 解析 毒瘤字符串读入 我就是不喜欢邻接 ...
随机推荐
- Sklearn——SVC学习笔记(图像分割)
新年第二更. 很长时间前就想总结一下用SVC来做图像分割的方法了,方法实现了,但是一直没有总结,今天再来回顾一遍. 首先介绍一下.今天要总结的图像分割其实属于像素级分类,其输出是把图像按照不同的类别逐 ...
- matplotlib如何显示中文
问题:matplotlib不能渲染中文 想设定为中文字体,网上搜索的方法几乎都是下面这样,已经把字体拷贝到了程序目录下了,然而并没有生效 plt.rcParams [ font.sans-serif' ...
- React中setState注意事项
setState是一个异步函数,异步获取数据 学习react在使用ref和setState操作DOM时会遇到的问题: ref获取ul结点元素 错误写法:得到的ul长度总是上一次输入后的长度 结果: 正 ...
- MySQL 数据库的提速器-写缓存(Change Buffer)
写缓存(Change Buffer) 是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在 buffer pool 中的话,在不影响数据一致性的前提下,InnoDB 引擎会将对数据的操 ...
- C# 如何实现完整的INI文件读写类
作者: 魔法软糖 日期: 2020-02-27 引言 ************************************* .ini 文件是Initialization File的缩写,即配置文 ...
- linux--解决celery消息中间件带来的一系列问题
启动celery定时任务 1.celery -A OpsManage beat -l info -S django 2.celery -A OpsManage worker -l info 此时消息中 ...
- [WPF 自定义控件]创建包含CheckBox的ListBoxItem
1. 前言 Xceed wpftoolkit提供了一个CheckListBox,效果如下: 不过它用起来不怎么样,与其这样还不如参考UWP的ListView实现,而且动画效果也很好看: 它的样式如下: ...
- 小程序封装request请求
//request.js var host = 'https://www.xxx.com';//请求域名 module.exports = function (type, params, method ...
- css选择器四大类:基本、组合、属性、伪类
什么是选择器?选择器的作用是通过它可以找到元素,把css样式传递给元素!css选择器主要分为:基本选择器.属性选择器.组合选择器与伪类选择器四个大类! css基本选择器 基本选择器又分为:*通配符.标 ...
- JS 重载父页面
<script language=javascript> window.onload=function(){ //刷新父页面 window.opener.location.reload() ...