p1341 无序字母对

传送门

题目

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

输入格式:

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

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

输出格式:

输出满足要求的字符串。

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

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

分析

任意俩字母的相邻关系可表示为一条路径,所以在相邻字母间连边,跑字典序最小欧拉回路即可。注意大写字母ASCII码比小写字母小!

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int n,m,minn=1000000007;
int g[1100][1100],du[11000],ans[110000],cnt;
void go(int x){
      int i,j,k;
      for(i=minn;i<=n;i++)
         if(g[x][i]){
             g[x][i]--,g[i][x]--;
             go(i);
         }
      ans[++cnt]=x;
}
int main(){
      int i,j,k,x,y;
      string s;
      cin>>m;
      for(i=1;i<=m;i++){
           cin>>s;
           x=s[0]-‘A‘;
           y=s[1]-‘A‘;
           g[x][y]++,g[y][x]++;
           du[x]++,du[y]++;
           n=max(n,max(x,y));
           minn=min(minn,min(x,y));
      }
      int st=minn;
      int sum=0,chg=0;
      for(i=minn;i<=n;i++)
         if(du[i]&1){
             sum++;
             if(!chg){
             st=i;
             chg=1;
            }
         }
      if(sum!=0&&sum!=2){
        puts("No Solution");
        return 0;
      }
      go(st);
      for(i=cnt;i>0;i--){
         char c=ans[i]+‘A‘;
         cout<<c;
      }
      return 0;
}

原文地址:https://www.cnblogs.com/yzxverygood/p/9097329.html

时间: 2024-10-17 09:55:06

p1341 无序字母对的相关文章

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

P1341 无序字母对 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出“No Solution”. 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 输入输出样例 输入样例#1: 4 a

洛谷P1341 无序字母对

P1341 无序字母对 229通过 806提交 题目提供者yeszy 标签图论福建省历届夏令营 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 不知道哪里错 求解释 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,

luogu P1341 无序字母对

P1341 无序字母对 直通 思路: 欧拉回路问题 坑点: ①第三个点出现了 5 ab ac ad ae af 这样的情况 所以我们需要加一点小优化: for(int i=0; i<=top; i++) { //特判第三个点... if(i==0) continue; if(!tmp[ans[i]][ans[i-1]]) { printf("No Solution"); return 0; } } ②我们还需要保证题目中给出的所有字母均在ans数组中出现,所以需要开2个vis数组

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

题目链接: https://www.luogu.org/problemnew/show/P1341 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出"No Solution". 如果有多种方案,请输出前面的字

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

题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出“No Solution”. 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 输入输出样例 输入样例#1: 4 aZ tZ Xt aX 输

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

题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出“No Solution”. 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 输入输出样例 输入样例#1: 4 aZ tZ Xt aX 输

P1341 无序字母对(Hierholzer算法判断欧拉回路)

https://www.luogu.com.cn/problem/P1341 https://blog.csdn.net/STILLxjy/article/details/51956183?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task https://blog.csdn.net/qq_37555704/article/details/83347641

[P1341]无序字母对 (欧拉回路)

我永远信仰欧拉 欧拉回路是很经典的一道题目了 这题算是稍稍修改的模板题吧 欢迎指出错误 题目链接 思路 先判断能不能构成欧拉路径/回路 即度数为1的总点数为2或0的时候符合(前者为连通图,后者为回路) 这题是回路吧 如果不可以,结束 如果可以,dfs搜索路径(貌似搜索路径还有模板来着) 代码 代码短,我就不压了 1 #include<bits/stdc++.h> 2 #define maxn 257 3 bool G[maxn][maxn]; 4 int deg[maxn]; 5 char t

P1341 无序字母对(欧拉回路+并查集)

1 //并查集判联通,dfs求解欧拉回路 2 #include<iostream> 3 using namespace std; 4 const int N=150; 5 int mp[N][N];//邻接矩阵存图 6 int d[N];//点的度数 7 char res[N*N];//大于C(52,1)*C(51,1)/2,边数 8 int n;//边数 9 void dfs(int now) 10 { 11 for(int i='A';i<='z';i++)//没什么好说的 12 {