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数组,一个记录给出的字母的出现,另外一个纪录ans数组中出现的字母,进行比较。

    如果vis数组中出现了,但是vis2数组中并没有出现,那么我们就可以直接输出No Solution,并退出程序即可

上代码:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

const int N = 52;
const char e[N] = {
    ‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,
    ‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,
    ‘O‘,‘P‘,‘Q‘,‘R‘,‘S‘,‘T‘,
    ‘U‘,‘V‘,‘W‘,‘X‘,‘Y‘,‘Z‘,
    ‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,
    ‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,
    ‘o‘,‘p‘,‘q‘,‘r‘,‘s‘,‘t‘,
    ‘u‘,‘v‘,‘w‘,‘x‘,‘y‘,‘z‘};
int n,Max,Min=N,top;
int map[N][N],tmp[N][N],ru[N],ans[10000000];
bool vis[N],vis2[N];

void dfs(int u) {
    for(int v=Min; v<=Max; v++) {
        if(!vis[v]) continue;
        if(map[u][v]>0) {
            map[u][v]--;
            map[v][u]--;
            dfs(v);
        }
    }
    ans[top++]=u;
}

int main() {
    scanf("%d",&n);
    char a,b;
    for(int i=1,u,v; i<=n; i++) {
        cin>>a>>b;
        u=a-‘A‘,v=b-‘A‘;
        if(u>=32) u-=6;
        if(v>=32) v-=6;
        vis[u]=vis[v]=true;
        map[u][v]++,map[v][u]++;
        tmp[u][v]++,tmp[v][u]++;
        ru[u]++,ru[v]++;
        Max=max(Max,max(u,v));
        Min=min(Min,min(u,v));
    }
    int s=Min;
    for(int i=Min; i<=Max; i++) {
        if(!vis[i]) continue;
        if(ru[i]%2==1) {
            s=i;
            break;
        }
    }
    dfs(s);
    top--;
    for(int i=0; i<=top; i++) { //特判第三个点...
        vis2[ans[i]]=true; //记录答案中出现的字母
        if(i==0) continue;
        if(!tmp[ans[i]][ans[i-1]]) {
            printf("No Solution");
            return 0;
        }
    }
    for(int i=Min; i<=Max; i++) {
        if(vis[i] && !vis2[i]) { //当前储存的答案中没有出现应该出现的字母
            printf("No Solution");
            return 0;
        }
    }
    for(int i=top; i>=0; i--) printf("%c",e[ans[i]]);
    return 0;
}

时间: 2024-11-07 10:46:39

luogu P1341 无序字母对的相关文章

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

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

洛谷P1341 无序字母对

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

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 无序字母对

传送门 题目 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出"No Solution". 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 分析 任意俩字母的相邻关系可表示为一条路径,所以在相邻字母间

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

Luogu 1341 无序字母对 - 欧拉路径

Solution 找一条字典序最小的欧拉路径. 用 $multiset$ 存储领接表. 欧拉路径模板传送门 Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<set> 5 using namespace std; 6 7 const int N = 1e3 + 5; 8 9 int n, up = 'z' - 'A' + 1; 10 int ans[N],

[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