题意:给定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;
}