点此看题面

大致题意:给你\(n\)个各不相同的无序字母对(注意:两个字母可能相同,被这个坑了好几次),请构造一个长度为\(n+1\)的字符串包含每个字母对。

欧拉回路

这是一道裸的欧拉回路,只不过是字符串版的,步骤较经典版略显麻烦。

依照欧拉回路的思路,我们先统计出每个字母出现的次数。然后对其中奇点的个数分类讨论:

没有奇点:则可以从任意一个点开始遍历。由于题目中要求字典序最小,所以从字典序最小的点开始遍历。

有两个奇点:则可以从任意一个奇点开始遍历。由于题目中要求字典序最小,所以从字典序较小的奇点开始遍历。

以上两种情况皆不满足:说明无解,输出“No Solution”。

代码

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define LL long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define N ('z'-'A'+1)
using namespace std;
int n,ee=0,cnt=0,In[N+5],f[N+5][N+5],ans[100000];
inline void write(int x)
{if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');
}
inline void dfs(int x)//dfs跑一遍欧拉回路
{for(register int i=1;i+'A'-1<='z';++i)if(f[x][i]) f[x][i]=f[i][x]=0,dfs(i);//将每一个能到达的字母按字典序一一遍历,并将连接当前字母与要到达的字母间的边删去ans[++cnt]=x;//统计答案
}
int main()
{register int i,j;char x,y,Min=0;for(scanf("%d",&n),i=1;i<=n;++i) cin>>x>>y,f[x-'A'+1][y-'A'+1]=f[y-'A'+1][x-'A'+1]=1,++In[x-'A'+1],++In[y-'A'+1],Min=Min?min(Min,min(x,y)):min(x,y);//更新每个字母的入度,并记录字典序最小的字母,为没有奇点的情况做准备int flag=0,t=0;//flag记录奇点的个数,t记录较小的奇点for(i=1;i<=N;++i) if(In[i]&1) ++flag,t=t?min(t,i):i;//更新较小的奇点if(flag&&flag^2) return puts("No Solution"),0;//如果奇点的个数不为0且不为2,就输出"No Solution"for(dfs(flag?t:(Min-'A'+1)),i=cnt;i>0;--i) putchar(ans[i]+'A'-1);//尽量从字典序小的点跑一遍欧拉回路,并倒着输出答案return 0;
}

转载于:https://www.cnblogs.com/chenxiaoran666/p/Luogu1341.html

【洛谷1341】无序字母对(欧拉回路)相关推荐

  1. 洛谷 1341 无序字母对

    欧拉路的裸题??? 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #inc ...

  2. [洛谷P1341]无序字母对

    题目大意:给一张无向图,找一条字典序最小的欧拉路径 题解:若图不连通或有两个以上的奇数点,则没有欧拉路径,可以$dfs$,在回溯时把这个节点加入答案 卡点:没有在回溯时加入答案,导致出现了欧拉路径没走 ...

  3. 洛古--P1341 无序字母对--欧拉路径--Sabrina--Sabrinadol

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

  4. 标题python之单个小写字母转为大写字母(洛谷P5704)

    标题python之单个小写字母转为大写字母(洛谷P5704) 字母转换 展开 题目描述 输入一个小写字母,输出其对应的大写字母.例如输入 q[回车] 时,会输出 Q. 输入格式 无 输出格式 无 in ...

  5. 欧拉回路【洛谷习题】无序字母对

    首先非常痛心疾首地说一句,欧拉回路自己之前只是看过代码,知道思想,从来没有亲手实现过,所以,,,伤亡惨重!!! 欧拉回路是一个非常有意思的图论模型,因为伟大的数学家欧拉(euler)而得名.传说,曾经 ...

  6. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  7. [洛谷P3181] [HAOI2016]找相同字符

    洛谷题目链接:[HAOI2016]找相同字符 题目描述 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. 输入输出格式 输入 ...

  8. 洛谷 P1019 单词接龙 (DFS)

    题目传送门 当时一看到这题,蒟蒻的我还以为是DP,结果发现标签是搜索-- 这道题的难点在于思路和预处理,真正的搜索实现起来并不难.我们可以用一个贪心的思路,开一个dic数组记录每个单词的最小重复部分, ...

  9. 洛谷1042 乒乓球 解题报告

    洛谷1042 乒乓球 本题地址: http://www.luogu.org/problem/show?pid=1042 题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球 ...

最新文章

  1. 测试整数(二进制)含1个数
  2. 面试题leetcode 3. 无重复字符的最长子串 暴力法和滑动窗口解法
  3. 全球及中国自媒体行业营销模式及应用规模前景分析报告2021-2027年
  4. poj3254 Corn Fields
  5. Vestigium-Google CodeJam 2020资格回合问题1解决方案
  6. C#编程语言(七):值类型与引用类型
  7. Python实现简单的用户管理系统
  8. python周环比增长率怎么算_Pandas实现计算同比、环比
  9. 中国象棋-单机游戏-微信小程序的项目开发流程详解
  10. 手把手教你搭建docker环境
  11. bzoj1627 / P2873 [USACO07DEC]泥水坑Mud Puddles
  12. 嫡权法赋权法_Python实现客观赋权法
  13. 扡扫机器人_石头扫地机器人评测:扫拖一体 指哪扫哪
  14. 解决谷歌浏览器:Flash插件初始化失败,请更新您的FlashPlayer版本之后重试!
  15. 【Word】论文的章标题以汉字编号,图、表以数字编号的实现
  16. oracle 排序算法,ORACLE的ORDERBY非稳定的排序
  17. 地图上必须要有指北针吗?
  18. Java实现蓝桥杯突击战
  19. 计算机翻转课堂教案,“翻转课堂 ”——无线投屏颠覆传统教育
  20. Ubuntu学习笔记——双系统无法进入Ubuntu以及Ubuntu桌面无法显示

热门文章

  1. 第十二届蓝桥杯青少年组国赛C++中级组 第1题 -- 第3题(python3实现)
  2. P5708 【深基2.习2】三角形面积(python3实现)
  3. 1.3编程基础之算术表达式与顺序执行 02 计算(a+b)*c的值
  4. python flag 参数_flag_flagpython_js开关flag - 云+社区 - 腾讯云
  5. Linux基础学习七:mysql的安装和配置教程
  6. 计算机网络-VRRP
  7. Java笔记-Spring Boot使用外部Tomcat及解决Tomcat乱码
  8. Java笔记-为客户端及服务端创建公私钥的密钥库
  9. Qt工作笔记-使用SQL中的LIMIT进行数据分页
  10. 乾坤 微前端_最全汇总之微前端知识和实战(EMP技术方案)