P1341 无序字母对
题目链接
刚看到题目,一脸懵逼,没有任何头绪。最后看题解才知道是欧拉通路,(好吧,我根本不会),于是又先学了一波欧拉通(回)路,最终学习洛谷大佬的题解才解了这道题。懂了欧拉通路这道题就非常简单了,不多累赘;对了,这题还要求字典序,最坑的一点就是记录字母了,必须从后往前记录,也就是回溯记录,再从后往前输出;wa了几发才明白。
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int dian[200][200];
int ds[200];
int step[20000];//记录路径
int ans;
void dfs(int p){
for(int i=1;i<=200;i++){
if(dian[p][i]>0){
//step[ans++]=i;//记录路径
dian[p][i]--;//毁图
dian[i][p]--;
dfs(i);
}
}
step[ans++]=p;
return;
}
void print(){
for(int i=ans-1;i>=0;i--){
printf("%c",step[i]);
}
cout<<endl;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>s;
dian[s[0]][s[1]]++;//存边,无向图
dian[s[1]][s[0]]++;
ds[s[0]]++;//记录度数
ds[s[1]]++;
}
int sta=0x3f3f3f3f;
int sum=0;//记录奇度顶点的数量
for(int i=1;i<=200;i++){
if(ds[i]&1){//判断是否有奇度顶点,如果有则从奇度顶点开始
sta=min(sta,i);
sum++;
}
}
if(sum&&sum!=2){
cout<<"No Solution"<<endl;
return 0;
}
if(sum==2){
//cout<<sta<<endl;
//step[ans++]=sta;
dfs(sta);
print();
return 0;
}
for(int i=1;i<=200;i++){//如果没有奇度顶点
if(ds[i]){
//step[ans++]=i;
dfs(i);
print();
return 0;
}
}
return 0;
}