无序字母对

本题地址:http://www.luogu.org/problem/show?pid=1341

题目描述

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

输入输出格式

输入格式:

第一行输入一个正整数n。
以下n行每行两个字母,表示这两个字母需要相邻。

输出格式:

输出满足要求的字符串。
如果没有满足要求的字符串,请输出“No Solution”。
如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案

输入输出样例

输入样例#1:

4
aZ
tZ
Xt
aX

输出样例#1:

XaZtX
 

说明

【数据规模与约定】
不同的无序字母对个数有限,n的规模可以通过计算得到。

思路

  容易看出这是一个欧拉图。然而我思索了良久也不会写一个图的算法,只好用深搜和回溯写,又然而数据是在太水,竟然过了!

  P1:我用到了重边的判断。

  P2:要求按字典序输出,那么搜索的时候就从字典序最小的那一个开始搜索。

var a:array[‘A‘..‘z‘,‘A‘..‘z‘] of longint;
    du:array[‘A‘..‘z‘] of longint;
    ans:array[0..100000] of char;
    n:longint;

procedure dfs(u:char;tot:longint);
var j:longint;k:char;
begin
    ans[tot]:=u;
    if tot=n+1 then
        begin
            for j:=1 to n+1 do write(ans[j]);
            writeln;
            halt;
        end;
    for k:=‘A‘ to ‘z‘ do
        if a[u,k]<>0 then
            begin
                dec(a[u,k]);
                dec(a[k,u]);
                dfs(k,tot+1);
                inc(a[k,u]);
                inc(a[u,k]);
                //回溯
            end;
end;

procedure change;
begin
    fillchar(a,sizeof(a),0);
    fillchar(du,sizeof(du),0);
end;

procedure init;
var i:longint;one,two:char;
begin
    readln(n);
    for i:=1 to n do
        begin
            readln(one,two);
            inc(a[one,two]);
            inc(a[two,one]);
            inc(du[one]);
            inc(du[two]);
        end;
end;

procedure main;
var x:char;one,two:char;
begin
    for x:=‘A‘ to ‘z‘ do
        if (du[x] mod 2=1) then
            begin
                if two<>‘ ‘ then
                    begin
                        writeln(‘No Solution‘);
                        halt;
                    end;
                if (one<>‘ ‘)and(two=‘ ‘) then two:=x;
                if one=‘ ‘ then one:=x;
            end;
    if (one<>‘ ‘)and(two=‘ ‘) then
        begin
            writeln(‘No Solution‘);
            halt;
        end;
    //考虑到可能有重边的情况,one和two是两个备用字符串
    if (one=‘ ‘)and(two=‘ ‘) then
        begin
            for x:=‘A‘ to ‘z‘ do
                if du[x]<>0 then
                    break;
            dfs(x,1);
        end
    else
        if one>two then
            dfs(two,1)
        else
            dfs(one,1);
    //一切为了字典序
end;

begin
    change;
    init;
    main;
end.

时间: 2024-12-30 10:58:11

无序字母对的相关文章

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

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

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

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

洛谷P1341 无序字母对

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

洛谷1341 无序字母对

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

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

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

1341 无序字母对

难度:提高+/省选- 题目类型:图论 提交次数:6 涉及知识:dfs/欧拉路径 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一个正整数n. 以下n行每行两个字母,表示这两个字母需要相邻. 输出格式: 输出满足要求的字符串. 如果没有满足要求的字符串,请输出"No Solution". 如果有多种方案,请输出前面的字母的ASCII编码尽

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

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

「LuoguP1341」 无序字母对(欧拉回路

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