无序字母对

博客围绕无序字母对展开,但具体内容缺失,推测可能涉及无序字母对在信息技术领域的应用、处理等相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
int n,head;
char a[2];
int b[130][130];//存图
int deg[130],fa[130];//deg存储度数,fa存储父亲,用来并查集判断是否联通
char ans[1330];//稍大于51*52/2
int find(int x)
{
    if(fa[x]==x)return x;
    return fa[x]=find(fa[x]);
}
void dfs(int x)//找欧拉回路/路径
{
    for(int i=64;i<=125;i++)
      if(b[x][i])
      {
        b[x][i]=b[i][x]=0;
        dfs(i);
      }
    ans[n--]=x;//因为是回溯的时候存,所以倒着存
}
int main()
{
    cin>>n;
    for(int i=64;i<=125;i++)fa[i]=i;
    //A在ASCII码表里为65,z为122,所以64~125就足够了
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        b[a[0]][a[1]]=b[a[1]][a[0]]=1;
        deg[a[0]]++;
        deg[a[1]]++;
        int xx=find(a[0]),yy=find(a[1]);
        fa[xx]=yy;
    }
    int cnt=0;
    for(int i=64;i<=125;i++)
      if(fa[i]==i&&deg[i])cnt++;//祖宗结点
    if(cnt!=1){cout<<"No Solution"<<endl;return 0;}//如果不是连通图
    cnt=0;
    head=0;
    for(int i=64;i<=125;i++)
    {
        if(deg[i]&1)
        {
            cnt++;
            if(head==0)head=i;//顺道存储起点
        }
    }
    if(cnt&&cnt!=2){cout<<"No Solution"<<endl;return 0;}
    //如果有奇数度数的点,并且不是两个,说明不存在欧拉回路/路径
    if(head==0)//如果是欧拉回路
      for(int i=64;i<=125;i++)
        if(deg[i]){head=i;break;}//找欧拉回路的起点
    dfs(head);
    cout<<ans;
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值