problem

  • 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。
  • 请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。
  • 输出字典序最小的方案(n的规模局势所有字母随机组合的大小)

solution

——背景
欧拉路:能够从无向图中的一个节点出发走一条道路,每条边恰好经过一次,这样的道路称为欧拉道路。
判定和证明:当且仅当图中有两个奇点时存在欧拉道路(对于每个点,必须有进有出)。没有奇点时存在欧拉回路。(一个隐含的条件,前提是图必须联通。
——题解:
建图:把每个字母做为一个节点,字母对的相邻字母之间连一条边表示新序列(道路,经过这条)中他们必须相邻。
然后找欧拉路并打印解就是答案。欧拉路保证了每个字母对都会满足(每条边都会经过一次)。

codes

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 256;//ASCLL//UnionFindSet判联通
int fa[maxn];
void init(int _n){for(int i = 1; i <= _n; i++)fa[i]=i;}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void merge(int x, int y){x=find(x),y=find(y);fa[x]=y;}//EulerRoad
int n, e[maxn][maxn], depth[maxn]; char ans[maxn];
void eular(int x){//cout<<(char)x;for(int i = 0; i < maxn; i++){if(e[x][i]){e[x][i] = e[i][x] = 0;//走过了就把边去掉eular(i);}}ans[n--] = x;//字典序最小
}int main(){cin>>n;init(maxn-1);for(int i = 1; i <= n; i++){char t[10];  scanf("%s",t);e[t[0]][t[1]] = e[t[1]][t[0]] = 1;merge(t[0], t[1]);depth[t[0]]++, depth[t[1]]++;}//1.判联通int cc = 0;for(int i = 0; i < maxn; i++)//联通块个数if(fa[i]==i && depth[i])cc++;//dep保证是图上的节点if(cc != 1){ cout<<"No Solution"; return 0;}//不连通,不存在一笔画//2.有且仅两个奇点,欧拉道路int cnt = 0, star = 0;for(int i = 0; i < maxn; i++){if(depth[i]&1){cnt++;if(!star)star = i;//从奇点出发}}//3.没有奇点,欧拉回路if(cnt==0){for(int i = 0; i < maxn; i++){if(depth[i]){star = i; break;//随便找个图上的点出发}}}//4.奇怪的奇点,无解if(cnt && cnt!=2){ cout<<"No Solution"; return 0;}//5.输出路径eular(star);puts(ans);return 0;
}

【Luogu1341】无序字母对(并查集联通,欧拉路模板)相关推荐

  1. luogu1341 无序字母对

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

  2. [luogu1341] 无序字母对

    欧拉路径模板,但是细节有点多-- 存在欧拉路径的条件: 图连通 : 使用并查集维护 只有两个点的度为奇数,或者没有一个点 #include <cstdio> #include <cs ...

  3. 并查集及路径压缩模板

    并查集那最简单的应用就是合并两个元素和查询两个元素是否属于同一集体,它的工作过程如下:首先将每个元素放在单独的一个集合里,集合的名字就是这个元素的编号,对于查询操作就找两个元素的所在集合编号,集合编号 ...

  4. L2-013 红色警报 并查集

    题目连接 题解:连通块问题显然要与并查集有关,而且C4比赛极喜欢出与并查集有关的知识. 这道题可以这样做,即我每次去掉一个城市的时候,都对剩余的城市重新建立并查集,然后判断联通块的数量有没有删减,如果 ...

  5. 每日一题——洛谷 P1551 亲戚 (并查集)

    大家好,我是爬行系,今天打卡并查集相关例题 文章目录 并查集 1.概念 2.模板 例题 1.题目描述 2.AC代码 更多练习题 总结 并查集 1.概念 并查集的思想是用一个数组表示了整片森林(pare ...

  6. (并查集模板)AcWing 模板+例题240.食物链

    并查集最简单的模板 #include <bits/stdc++.h>using namespace std; int p[100010]; int n,m; int Find(int x) ...

  7. [bzoj4998][LCT][并查集]星球联盟

    Description 在遥远的S星系中一共有N个星球,编号为1-N.其中的一些星球决定组成联盟,以方便相互间的交流.但是,组成 联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条 ...

  8. 「图论」第1章 并查集课堂过关

    文章目录 A. [例题1][模板]并查集 题目 代码 B. [例题2]程序自动分析 题目 代码 C. [例题3]银河英雄传说 题目 题目背景 题目描述 输入格式 输出格式 输入输出样例 说明/提示 思 ...

  9. 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】...

    1 build 1.1 Description 从前有一个王国,里面有n 座城市,一开始两两不连通.现在国王将进行m 次命令,命令可 能有两种,一种是在u 和v 之间修建道路,另一种是询问在第u 次命 ...

最新文章

  1. 关于String数组的用法
  2. dotnet new 命令使用模板生成Angular应用
  3. phpinfo信息泄漏
  4. 乘风破浪:LeetCode真题_007_Reverse Integer
  5. php 检测密码,php如何检测账号密码是否匹配
  6. Linux / Server 端收到 SIGPIPE 信号的原因
  7. CAS(比较并交换)学习CAS实现原子性+volatile实现可见性,cas与synchronized比较的优缺点
  8. 【算法分析与设计】寻找假币问题
  9. 9年120亿,美的数字化转型纪实
  10. efficientdet-pytorch训练自己的数据集
  11. 公共计算机房电气设计规范,《住宅建筑电气设计规范》(总结版)
  12. JPA环境下使用Hibernate二级缓存
  13. 桥连模式,模板模式的改进
  14. asp.net 各种小窍门
  15. 教学概述+教学内容+教学原则+教学方法+教学组织...+教学模式和教学策略
  16. c#时分秒毫秒微妙_c# - 将秒转换为(小时:分钟:秒:毫秒)时间的最佳方法是什么?...
  17. 学计算机的学生用什么笔记本电脑,什么样的笔记本电脑对学生有好处?这再合适不过了!...
  18. oracle风扇设置,HP DL380 G6风扇满速原因
  19. 李建忠设计模式之总结
  20. 为什么我从Flutter转投Electron的怀抱?

热门文章

  1. 【笔试/面试】—— 计算一个数二进制形式中 0 的个数
  2. 【算法】—— str2int(正序和逆序)
  3. Python 数据结构与算法——选择排序(迭代版、递归版)
  4. 面向对象——类设计(五)
  5. 面向对象——类设计(二)
  6. word的使用(二)
  7. 不是区块链的特征_区块链的四大特征
  8. python教程-Python2 教程
  9. 自学python好找工作么-学习python后好找工作吗
  10. 论文笔记:语音情感识别(三)手工特征+CRNN