【洛谷P1341 无序字母对】 解题报告

【洛谷P1341 无序字母对】 解题报告

题目描述

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

输入输出格式

输入格式:

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

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

输出格式:

输出满足要求的字符串。

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

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

输入输出样例
input

4
aZ
tZ
Xt
aX

ouput

XaZtX

思路:

一看就知道是个欧拉回路问题。
欧拉路是指图是连通的而且有且只有两个奇点。而欧拉回路则是有0个奇点(奇点指的是 点的度数为奇数)。

欧拉路就是从字典序最小的个奇点开始,到另一个奇点。
欧拉回路就是从那个字典序最小的字母开始走。

Codes:

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
#define maxn 2024
int n;
int e[maxn][maxn],du[maxn],road[maxn];
int s=0x7fffffff,pos,cnt;

int get(char x)
{
    if(x<='z'&&x>='a') return x-'a'+27;
    return x-'A'+1;
}

int pt(char x)
{
    if(x<=26) return 'A'+x-1;
    return 'a'+x-27;
}

void dfs(int x)
{
    for(int y=1;y<=52;y++)
        if(e[x][y]==1)
        {
            e[x][y]=e[y][x]=0;
            dfs(y);
        }
    road[++pos]=x;
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        char x,y;cin>>x>>y;
        du[get(x)]++;du[get(y)]++;
        e[get(x)][get(y)]=e[get(y)][get(x)]=1;
    }
    for(int i=1;i<=52;i++)
        if(du[i]&1)
        {
            s=min(s,i);
            cnt++;
        }
    if(cnt!=0&&cnt!=2)
    {
        cout<<"No Solution";
        return 0;
    }
    if(cnt==0)
        for(int i=1;i<=52;i++)
            if(du[i])
            {
                s=i;
                break;
            }
    dfs(s);
    for(int i=pos;i>=1;i--)
        printf("%c",pt(road[i]));
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值