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

题解:每个无需字母对可以看成无向图中的一条边。因此,题目中让构造的就是一个欧拉路(路径或回路均可),即:无向图中的每条边恰好经过一次的路径。存在欧拉路的充要条件是:无向图联通,且每个顶点的度均为偶数有且仅有两个顶点的度为奇数。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=151; bool G[maxn][maxn];
int n,f[maxn],deg[maxn];
char ch[5],stk[maxn<<2]; inline int find(int x){
return x==f[x]?f[x]:f[x]=find(f[x]);
} void read_and_parse(){
scanf("%d",&n);
for(int i=1;i<=150;i++)f[i]=i;
for(int i=1;i<=n;i++){
scanf("%s",ch+1);
G[ch[1]][ch[2]]=G[ch[2]][ch[1]]=1;
f[find(ch[1])]=find(ch[2]);
++deg[ch[1]],++deg[ch[2]];
}
} void dfs(int u){
for(int i=1;i<=150;i++)if(G[u][i]){
G[u][i]=G[i][u]=0;
dfs(i);
}
stk[n--]=u;
} void solve(){
int cnt=0,st=0;
for(int i=1;i<=150;i++)if(f[i]==i&&deg[i])++cnt;
if(cnt!=1){puts("No Solution");return;}
cnt=0;
for(int i=1;i<=150;i++)
if(deg[i]&1){
++cnt;
if(!st)st=i;
}
if(!st){for(int i=1;i<=150;i++)if(deg[i]){st=i;break;}}
if(cnt&&cnt!=2){puts("No Solution");return;}
dfs(st);
puts(stk);
} int main(){
read_and_parse();
solve();
return 0;
}

最新文章

  1. etcd第三集
  2. 青瓷引擎之纯JavaScript打造HTML5游戏第二弹——《跳跃的方块》Part 10(排行榜界面&amp;界面管理)
  3. Rank List
  4. JS幻灯片,循环播放,滚动导航,jQuery平滑旋转幻灯片
  5. 学习笔记_过滤器详细(过滤器JavaWeb三大组件之一)
  6. cas配置全攻略(转)
  7. CentOS下安装nginx并且升级nginx到最新版
  8. c++的引用和c的指针之创建链表,二叉树的烦恼和区别
  9. org.apache.commons.net.ftp
  10. Python3 命令行参数
  11. python的filter函数的使用方法详解以及使用案例,是否以什么结尾,是否大于什么(判断是True,则留下来)
  12. C 标准库 - ctype.h之isalpha使用
  13. D3 JS study notes
  14. 第132天:移动web端-rem布局(进阶)
  15. 51NOD 1709:复杂度分析——题解
  16. centOS7下安装laravel + composer
  17. 用Eclipse进行java学习的步骤
  18. mysql中添加中文存储和显示功能
  19. react-native 常用组件的用法(一)
  20. Postgresql 查看建表语句 命令

热门文章

  1. MFC CTreeCtrl运用
  2. banner 跟随鼠标呈现视差效果
  3. Grid布局20行代码快速生成瀑布流
  4. LABVIEW串口通信基础
  5. LintCode——第K大元素
  6. Google Kickstart Round.B C. Diverse Subarray
  7. 关于go v1.11安装后出现不能正常运行测试程序的问题
  8. mysql 查询所有子节点的相关数据
  9. Mac 绑定Gitlab或者GitHub帐号,从新生成公钥
  10. JAVA面对对象(一)——封装