题目链接:

https://www.luogu.org/problemnew/show/P1341

题目描述

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

输入输出格式

输入格式:

第一行输入一个正整数n。

以下n行每行两个字母,表示这两个字母需要相邻。

输出格式:

输出满足要求的字符串。

如果没有满足要求的字符串,请输出“No Solution”。

如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案

输入输出样例

输入样例#1: 
4
aZ
tZ
Xt
aX
输出样例#1:
XaZtX

解题思路:

非常有意思的一道题,主要考察欧拉回路和欧拉路径的运用。

1,首先针对题目样例,输出样例不是aXtZa,因为'a'的ascii码是97,'X'的ascii码是88。

2,将每一个字符看做一个孤立的点,利用输入的数据建立无向图,如果图连通并且存在欧拉回路(每个节点的度数均为偶数)或者存在欧拉路径(仅存在两个点的度数是奇数,其余点的度数均为偶数),则满足题目要求,再从头dfs一遍记录结果即可。

欧拉回路:通过所有边一次且仅一次,最终回到出发点的路(每个节点的度数均为偶数)

欧拉路径:通过所有边一次且仅一次,最终不回到出发点的路(仅存在两个点的度数是奇数,其余点的度数均为偶数)

#include <iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int f[125];
int ed[125][125];
int deg[125];
int ans[1000010];
int n;
//A 65 z 122
int findroot(int x){//并查集判连通
if(x==f[x]) return x;
return f[x]=findroot(f[x]);
}
void dfs(int k){//记录路径
for(int i=65;i<=122;i++){
if(ed[k][i]){
ed[k][i]=ed[i][k]=0;
dfs(i);
}
}
ans[n--]=k;
}
int main(int argc, char** argv) {
scanf("%d",&n);
int m=n;
memset(ed,0,sizeof(ed)); for(int i=65;i<=122;i++) f[i]=i; for(int i=1;i<=n;i++){
string s;cin>>s;
ed[s[0]][s[1]]=ed[s[1]][s[0]]=1;
deg[s[0]]++;deg[s[1]]++; int x=findroot(s[0]),y=findroot(s[1]);
if(x!=y) f[x]=y;
}
int cnt=0;
for(int i=65;i<=122;i++) if(f[i]==i&&deg[i]) cnt++;
if(cnt!=1) {printf("No Solution\n");return 0;}//图不连通,退出 int st=0;
cnt=0;
for(int i=65;i<=122;i++){
if(deg[i]&1){
cnt++;
if(!st) st=i;
}
}
if(cnt>2) {printf("No Solution\n");return 0;}//不满足欧拉路径,退出 if(!st){//不存在欧拉路径,但存在欧拉回路
for(int i=65;i<=122;i++) if(!(deg[i]&1)&&deg[i]) {st=i;break;}
}
dfs(st); for(int i=0;i<=m;i++) printf("%c",ans[i]-65+'A');
return 0;
}

P1341 无序字母对(欧拉回路)的更多相关文章

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

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

  2. 洛谷 P1341 无序字母对(欧拉回路)

    题目传送门 解题思路: 一道欧拉回路的模板题,详细定理见大佬博客,任意门 AC代码: #include<cstdio> #include<iostream> using nam ...

  3. 洛谷P1341 无序字母对(欧拉回路)

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

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

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

  5. 洛谷 P1341 无序字母对(欧拉路)

    P1341 无序字母对 题目提供者yeszy 标签 福建省历届夏令营 难度 提高+/省选- 最新讨论 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造 ...

  6. P1341 无序字母对【欧拉路径】- Hierholzer模板

    P1341 无序字母对 提交 24.87k 通过 6.80k 时间限制 1.00s 内存限制 125.00MB 题目提供者yeszy 难度提高+/省选- 历史分数100 提交记录 查看题解 标签 福建 ...

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

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

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

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

  9. P1341 无序字母对

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

随机推荐

  1. 精尽Spring MVC源码分析 - 文章导读

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  2. 带宽、延时、吞吐率、PPS 这些都是啥?

    Linux 网络协议栈是根据 TCP/IP 模型来实现的,TCP/IP 模型由应用层.传输层.网络层和网络接口层,共四层组成,每一层都有各自的职责. 应用程序要发送数据包时,通常是通过 socket ...

  3. js上 五、运算符-1

    5.1.认识运算符 什么是运算符? 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算. 运算符的应用: 购物车:计算总价,数量: **Js ** 中有哪些运算符? 算术运算符.赋值运算符 ...

  4. react第八单元(什么是纯函数-组件的性能优化-pureComponent-组件性能优化的原理)

    课程目标 理解纯函数 熟练掌握组件性能优化的几种技巧 pureComponent和Component的区别 #知识点 一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用,我们就把这个函数 ...

  5. react第十六单元(redux的认识,redux相关api的掌握)

    第十六单元(redux的认识,redux相关api的掌握) #课程目标 掌握组件化框架实现组件之间传参的几种方式,并了解两个没有任何关系组件之间通信的通点 了解为了解决上述通点诞生的flux架构 了解 ...

  6. Shell-匹配行及date日期转换

    #将指定字符串转化为从1970年1月1日到现在的秒数. date -d '20170506' "+%s" #将1970年1月1日到现在累计的秒数转化为日期 date -d @149 ...

  7. 职场PUA,管理者的五宗罪

    在目前的社会环境下,程序员似乎成了"弱势群体".我们经常谈论的职场PUA已经成为程序员的代名词. 我一直在想,为什么这么多管理者能力会这么差. 但最后最吃亏的还是可怜的程序员. 也 ...

  8. Solr:Slor初识(概述、Windows版本的安装、添加IK分词器)

    1.Solr概述 (1)Solr与数据库相比的优势 搜索速度更快.搜索结果能够按相关度排序.搜索内容格式不固定等 (2)Lucene与Solr的区别 Lucene提供了完整的查询引擎和索引引擎,目的是 ...

  9. 闲鱼上哪些商品抢手?Python 分析后告诉你

    1目 标 场 景 经常看到有朋友在闲鱼卖些小东西又或是自己擅长的一些技能,都能为他们带来不错的 睡后收入. 闲鱼上大量的商品,很难精准判断哪些受欢迎,哪些好卖:一个个录入数据去做数据分析,浪费时间的同 ...

  10. .NET+SqlServer 实现数据读写分离

    如今,我们操作数据库一般用ORM框架 现在用.NET Core + EFCore + SqlServer 实现数据读写分离 介绍 为什么要读写分离? 降低数据库服务器的压力 如何实现读写分离? 1.一 ...