欧拉回路 无序字母对

版权声明:未经本蒟蒻同意,请勿转载本蒻博客 https://blog.csdn.net/wddwjlss/article/details/81810886

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

做法:因为n个无序字母对(n条边),结果要求含有n+1个字母,所以建无向图跑欧拉回路。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;
stack<int> s;
int m,g[2000][2000],du[5000],n;
void dfs(int u)
{
    for(int v=1;v<=n;++v)
    {
        if(g[u][v])
        {
            g[u][v]--;
            g[v][u]--;
            dfs(v);
        }
    }
    s.push(u);
}
int cnt,mi=999999999;
int main()
{
    cin>>m;
    for(int i=1;i<=m;++i)
    {
        char s[10];
        scanf("%s",s+1);
        int x=s[1]-'0'+1;
        int y=s[2]-'0'+1;
        n=max(max(x,y),n);
        mi=min(min(x,y),mi);
        g[x][y]++;
        g[y][x]++;
        du[x]++;
        du[y]++;
    }
    for(int i=1;i<=n;++i)
    {
        if(du[i]%2==1)
            cnt++;
    }
    if(cnt==1||cnt>2)//如果奇点的个数不为0或2,则无解
    {
        cout<<"No Solution";
        return 0;
    }
    int st=mi;
    for(int i=1;i<=n;++i)
    {
        if(du[i]%2==1)
        {
            st=i;
            break;
        }
    }
    dfs(st);
    while(!s.empty())
    {
        char ans=s.top()+'0'-1;
        cout<<ans;
        s.pop();
    }   
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wddwjlss/article/details/81810886