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

洛谷P1341 无序字母对

题解:
题目是一个很裸的欧拉图,分为欧拉通路与欧拉回路,因此每个边的度只能为1或2,度为1的点只能为0或2个,故满足条件的即可输出,首先判断一下是不是欧拉图,不是的话直接输出“No Solution”,若是的话对你的图进行dfs遍历,如果是一个回路,则从第一个度不为0的点开始,如果是一个通路,就从字典序较小的那个点开始,最后翻转输出即可。AC代码如下:

#include<bits/stdc++.h>
using namespace std;
vector<int>path;
int n,mmp[55][55]= {0},cnt[55]= {0};
string str;
void dfs(int o)
{
    for(int i=1; i<=52; i++)
    {
        if(mmp[o][i])
        {
            mmp[o][i] = mmp[i][o] = 0;
            dfs(i);
        }
    }
    path.push_back(o);
}
int main()
{
    cin>>n;
    for(int i=0; i<n; ++i)
    {
        cin>>str;
        int x,y;
        if(str[0]>='a'&&str[0]<='z')
            x=str[0]-'a'+26;
        else
            x=str[0]-'A';
        if(str[1]>='a'&&str[1]<='z')
            y=str[1]-'a'+26;
        else
            y=str[1]-'A';
        x++;
        y++;
        mmp[x][y]=mmp[y][x]=1;
        cnt[x]++;
        cnt[y]++;
    }
    int flag=0,x,y,Count=0;
    for(int i=1; i<=52; ++i)
        if(cnt[i]&1)
        {
            Count++;
            if(Count==1)
                x=i;
            else
                y=i;
        }
        else if(cnt[i]!=0&&flag==0)
            flag=i;
    string wdnmd="0ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    if(Count==1||Count>2)
        cout<<"No Solution";
    else
    {
        if(Count==0)
            dfs(flag);
        else
            x<y?dfs(x):dfs(y);
        reverse(path.begin(),path.end());
        for(int i=0; i<path.size(); ++i)
            cout<<wdnmd[path[i]];
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BeZer0

打赏一杯奶茶支持一下作者吧~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值