题目:https://www.luogu.org/problemnew/show/P1341
本题较简单,每对字母看作一条边,两个端点表示两个结点。要注意的有两点:1、允许有重边,允许有自环。2、数组要开大,因为52个字母,允许字母重复凑对,最多可以得到2704对,所以,数组开到3000*3000,大小为900万,不会MLE。
AC代码:
#include<cstdio>
#include<iostream>
using namespace std;
int n;
char a,b;
int m[3000][3000],du[3000],vis[3000],ans[3000];
int minn=3000,maxx=0;
int cns=0;
bool flg=0;
void print(){
for(int i=cns;i>=1;i--)printf("%c",ans[i]+'A');
}
void dfs(int x){
if(flg)return;
for(int i=minn;i<=maxx;i++)
if(m[x][i]){
m[x][i]--;
m[i][x]--;
dfs(i);
}
ans[++cns]=x;
}
int main(){
cin>>n;
char a,b;
for(int i=1;i<=n;i++){
cin>>a>>b;
if(minn>a-'A')minn=a-'A';
if(minn>b-'A')minn=b-'A';
if(maxx<a-'A')maxx=a-'A';
if(maxx<b-'A')maxx=b-'A';
m[a-'A'][b-'A']++;
m[b-'A'][a-'A']++;
du[a-'A']++;
du[b-'A']++;
}
int t=0,odd_node=minn,clr=0;
for(int i=minn;i<=maxx;i++)if(du[i]%2==1){
t++;
if(clr==0){
odd_node=i;
clr=1;
}
}
if(t==1 ||t>2){
cout<<"No Solution";
return 0;
}
dfs(odd_node);
print();
return 0;
}