1. 程式人生 > >p1341 無序字母對

p1341 無序字母對

方案 iostream str 關系 pan .org AI TP return

傳送門

題目

給定n個各不相同的無序字母對(區分大小寫,無序即字母對中的兩個字母可以位置顛倒)。請構造一個有n+1個字母的字符串使得每個字母對都在這個字符串中出現。

輸入格式:

第一行輸入一個正整數n。

以下n行每行兩個字母,表示這兩個字母需要相鄰。

輸出格式:

輸出滿足要求的字符串。

如果沒有滿足要求的字符串,請輸出“No Solution”。

如果有多種方案,請輸出前面的字母的ASCII編碼盡可能小的(字典序最小)的方案

分析

任意倆字母的相鄰關系可表示為一條路徑,所以在相鄰字母間連邊,跑字典序最小歐拉回路即可。註意大寫字母ASCII碼比小寫字母小!

代碼

#include<iostream>


#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;

int n,m,minn=1000000007;
int g[1100][1100],du[11000],ans[110000],cnt;
void go(int x){
int i,j,k;
for(i=minn;i<=n;i++)
if(g[x][i]){
g[x][i]--,g[i][x]--;
go(i);
}
ans[++cnt]=x;
}
int main(){
int i,j,k,x,y;
string s;
cin>>m;
for(i=1;i<=m;i++){

cin>>s;
x=s[0]-‘A‘;
y=s[1]-‘A‘;
g[x][y]++,g[y][x]++;
du[x]++,du[y]++;
n=max(n,max(x,y));
minn=min(minn,min(x,y));
}
int st=minn;
int sum=0,chg=0;
for(i=minn;i<=n;i++)
if(du[i]&1){
sum++;
if(!chg){
st=i;
chg=1;
}
}
if(sum!=0&&sum!=2){
puts("No Solution");
return 0;
}
go(st);
for(i=cnt;i>0;i--){
char c=ans[i]+‘A‘;
cout<<c;
}
return 0;
}

p1341 無序字母對