洛谷P1341 无序字母对
题解:
题目是一个很裸的欧拉图,分为欧拉通路与欧拉回路,因此每个边的度只能为1或2,度为1的点只能为0或2个,故满足条件的即可输出,首先判断一下是不是欧拉图,不是的话直接输出“No Solution”,若是的话对你的图进行dfs遍历,如果是一个回路,则从第一个度不为0的点开始,如果是一个通路,就从字典序较小的那个点开始,最后翻转输出即可。AC代码如下:
#include<bits/stdc++.h>
using namespace std;
vector<int>path;
int n,mmp[55][55]= {0},cnt[55]= {0};
string str;
void dfs(int o)
{
for(int i=1; i<=52; i++)
{
if(mmp[o][i])
{
mmp[o][i] = mmp[i][o] = 0;
dfs(i);
}
}
path.push_back(o);
}
int main()
{
cin>>n;
for(int i=0; i<n; ++i)
{
cin>>str;
int x,y;
if(str[0]>='a'&&str[0]<='z')
x=str[0]-'a'+26;
else
x=str[0]-'A';
if(str[1]>='a'&&str[1]<='z')
y=str[1]-'a'+26;
else
y=str[1]-'A';
x++;
y++;
mmp[x][y]=mmp[y][x]=1;
cnt[x]++;
cnt[y]++;
}
int flag=0,x,y,Count=0;
for(int i=1; i<=52; ++i)
if(cnt[i]&1)
{
Count++;
if(Count==1)
x=i;
else
y=i;
}
else if(cnt[i]!=0&&flag==0)
flag=i;
string wdnmd="0ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
if(Count==1||Count>2)
cout<<"No Solution";
else
{
if(Count==0)
dfs(flag);
else
x<y?dfs(x):dfs(y);
reverse(path.begin(),path.end());
for(int i=0; i<path.size(); ++i)
cout<<wdnmd[path[i]];
}
return 0;
}