P1341 无序字母对

/*
欧拉路径 只要满足奇点 个数 ==0/2就一定存在路径 使每条边都走一遍 
看是否连通 -》并查集/在最后判断 是否有取到n+1个点 
从奇点 开始dfs倒序加入 
*/

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
//#include<queue>
//#include<vector>
//#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=10000+10;

int n,g[maxn][maxn],ans,rd[maxn],jidian,jd_cnt;
char s[maxn],path[maxn];

void dfs(int u)
{
    for(int i=1;i<=300;i++)
    {
        if(g[u][i]>0){
            g[u][i]--,g[i][u]--;
            //rd[u]--,rd[i]--;
            dfs(i);
        }
    }
    path[++ans]=u;
    return ;
}


int main()
{
    //ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>s;
        g[s[0]][s[1]]++;
        g[s[1]][s[0]]++;
        rd[s[0]]++,rd[s[1]]++;
    }
    for(int i=1;i<=300;i++){
        if(rd[i]%2==1){
            jd_cnt++;
            if(jidian==0) jidian=i;
        }
    }
    
    if(jd_cnt&&jd_cnt!=2){ cout<<"No Solution\n"; return 0; }
    
    if(jidian==0){//
        for(int i=1;i<=300;i++)
            if(rd[i]) { jidian=i; break;}
    }

    dfs(jidian);
    if(ans<n+1) { cout<<"No Solution\n";return 0;}
    
    for(int i=ans;i>=1;i--) cout<<path[i];cout<<'\n';
    
    return 0;
}

 

posted @ 2023-09-17 16:03  JMXZ  阅读(14)  评论(0)    收藏  举报