P1341 无序字母对

提交 24.87k
通过 6.80k
时间限制 1.00s
内存限制 125.00MB
题目提供者yeszy
历史分数100

提交记录

查看算法标签
进入讨论版

相关讨论

 
查看讨论

推荐题目

 
查看推荐
 

展开

题目描述

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

输入格式

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

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

输出格式

输出满足要求的字符串。

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

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

输入输出样例

输入 #1
  1. 4
  2.  
  3. aZ
  4.  
  5. tZ
  6.  
  7. Xt
  8.  
  9. aX
输出 #1
  1. XaZtX

说明/提示

【数据规模与约定】

不同的无序字母对个数有限,n的规模可以通过计算得到。

思路

  把字母相连看作连边,对整张图来说,每个字母对出现 = 可以找到一个欧拉路径/回路,所以只要先判断图是否连通,即判断是否该点:其度不为0且祖先是它本身。

  对于一张连通图来说,只要判断它是否能形成欧拉路径/回路即可,也就是有且只有两个度为奇数的点或全部的点度为偶数。

  如果可以形成欧拉路径/回路,就找一个度不为0的点作为起点套Hierholzer算法模板;

  Hierholzer算法存答案时需要反向存,这样做的好处是保证了无路可走时存下来的答案一定是欧拉路径的终点。

CODE

  1. #include <bits/stdc++.h>
  2. #define dbg(x) cout << #x << "=" << x << endl
  3. #define eps 1e-8
  4. #define pi acos(-1.0)
  5.  
  6. using namespace std;
  7. typedef long long LL;
  8.  
  9. template<class T>inline void read(T &res)
  10. {
  11. char c;T flag=;
  12. while((c=getchar())<''||c>'')if(c=='-')flag=-;res=c-'';
  13. while((c=getchar())>=''&&c<='')res=res*+c-'';res*=flag;
  14. }
  15.  
  16. namespace _buff {
  17. const size_t BUFF = << ;
  18. char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
  19. char getc() {
  20. if (ib == ie) {
  21. ib = ibuf;
  22. ie = ibuf + fread(ibuf, , BUFF, stdin);
  23. }
  24. return ib == ie ? - : *ib++;
  25. }
  26. }
  27.  
  28. int qread() {
  29. using namespace _buff;
  30. int ret = ;
  31. bool pos = true;
  32. char c = getc();
  33. for (; (c < '' || c > '') && c != '-'; c = getc()) {
  34. assert(~c);
  35. }
  36. if (c == '-') {
  37. pos = false;
  38. c = getc();
  39. }
  40. for (; c >= '' && c <= ''; c = getc()) {
  41. ret = (ret << ) + (ret << ) + (c ^ );
  42. }
  43. return pos ? ret : -ret;
  44. }
  45.  
  46. const int maxn = ;
  47.  
  48. int n;
  49.  
  50. int edge[maxn][maxn];
  51. int deg[maxn], fa[maxn];//出入度
  52. char ans[maxn*maxn];
  53.  
  54. stack <char> s;
  55.  
  56. int fid(int x) {
  57. return x == fa[x] ? x : fid(fa[x]);
  58. }
  59.  
  60. void init() {
  61. for (int i = ; i <= ; ++i) {
  62. fa[i] = i;
  63. }
  64. }
  65.  
  66. void dfs(int x) {
  67. for (int i = ; i <= ; ++i) {
  68. if(edge[x][i]) {
  69. edge[x][i] = edge[i][x] = ;
  70. dfs(i);
  71. }
  72. }
  73. ans[n--] = x;
  74. }
  75.  
  76. int main()
  77. {
  78. cin >> n;
  79. char a[];
  80. int cnt = ;
  81. init();
  82. for(int i = ; i <= n; i++) {
  83. cin >> a;
  84. edge[a[]][a[]] = edge[a[]][a[]]=;
  85. deg[a[]]++;
  86. deg[a[]]++;
  87. int x = fid(a[]), y = fid(a[]);
  88. fa[x]=y;
  89. //printf("x:fa[%d]:%d deg[%d]:%d\n",xx,fa[xx],a[0],deg[a[0]]);
  90. //printf("y:fa[%d]:%d deg[%d]:%d\n",yy,fa[yy],a[1],deg[a[1]]);
  91. }
  92.  
  93. for (int i = ; i <= ; ++i) {
  94.  
  95. if(fa[i] == i && deg[i]) {
  96. cnt++;
  97. //dbg(cnt);
  98. }
  99. }
  100. //dbg(cnt);
  101. if(cnt != ) {//图不连通
  102. puts("No Solution");
  103. return ;
  104. }
  105. //dbg(cnt);
  106. cnt = ;
  107. int head = ;
  108. for (int i = ; i <= ; ++i) {
  109. if(deg[i] & ) {
  110. cnt++;
  111. if(!head)
  112. head = i;
  113. //dbg(cnt);
  114. }
  115. }
  116. if(cnt && cnt != ) {
  117. puts("No Solution");
  118. return ;
  119. }
  120. if(!head) {
  121. for (int i = ; i <= ; ++i) {
  122. if(deg[i]) {
  123. head = i;
  124. break;
  125. }
  126. }
  127. }
  128. dfs(head);
  129. cout << ans << endl;
  130. return ;
  131. }

P1341 无序字母对【欧拉路径】- Hierholzer模板的更多相关文章

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

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

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

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

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

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

  4. P1341 无序字母对(欧拉回路)

    题目链接: https://www.luogu.org/problemnew/show/P1341 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一 ...

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

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

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

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

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

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

  8. P1341 无序字母对

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

  9. P1341 无序字母对[欧拉路]

    题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 解析 毒瘤字符串读入 我就是不喜欢邻接 ...

随机推荐

  1. DOCKER绝对领域从2048到4069?不:25519,数字的飞跃,HTTP/2

    这个标题花了几分钟,远远超过我构思以下内容的时间损耗,希望大家且看且珍惜,因为这是为数不多的cnblog特别标题 我记得很久以前,我开了一系列随笔,从第一篇揭发233的docker/machine开始 ...

  2. shell使用变量的值,获取一个新的变量名的值

    [root@localhost ~]# cat s2.sh #!/bin/bash color_name="red" red=31 color=`eval echo '$'&quo ...

  3. Flutter Widgets 之 FutureBuilder

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 展示异步任务状态 当有一个Future(异步)任务需要展示 ...

  4. 【问题】多重继承时,super函数只初始化继承的第一个类,不初始化第二个类。

    class A(object): def __init__(self): print("init class A") class B(object): def __init__(s ...

  5. C#中实现文件拖放打开的方法

    C#中实现文件拖放打开的方法 设置Form属性 AllowDrop = True; 在Form事件中 private void Form1_DragDrop(object sender, DragEv ...

  6. VSTO开发指南(VB2013版) 第二章 Office解决方案介绍

    实例2.1 通过控制台实现对Excel的自动化处理 书本第32页 注:添加两个引用: 第一个:程序集—框架—“System.Windows.Forms 4.0.0.0”第二个:程序集—扩展—“Micr ...

  7. 一个用python写的比特币均线指标

    https://blog.csdn.net/gsl222/article/details/104554397 https://github.com/yyy999/auto_ma912 一个用pytho ...

  8. C#上位机之—WinForm实现串口通信示例

    上位机开发常用到串口通信来控制设备,串口通信的主要参数:COM口,波特率(9600),停止位(One),数据位(8),校验位(None),括号中的是常用值,具体意思我也不太懂,会用能实现功能就行哈哈: ...

  9. workerman离线推送方案

    方案一:目前网上比较流行的 方案二:参考腾迅IM

  10. MySql学习-3.命令脚本

    一.数据库操作: 1. 登录数据库:mysql -uroot -p (这个password是自己设定的,我这里的没密码) 注意:(数据路径是:D:\MySql\install1\data 操作路径:D ...