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