【問題描述】
給定n個各不相同的無序字母對(區分大小寫,無序即字母對中的兩個字母可以位置顛倒)。請構造乙個有n+1個字母的字串使得每個字母對都在這個字串中出現。
【輸入格式】
第一行輸入乙個正整數n。
以下n行每行兩個字母,表示這兩個字母需要相鄰。
【輸出格式】
輸出滿足要求的字串。
如果沒有滿足要求的字串,請輸出「no solution」。
如果有多種方案,請輸出前面的字母的ascii編碼盡可能小的(字典序最小)的方案
【輸入樣例】
4 az
tz xt
ax【輸出樣例】
xaztx
【資料範圍】
不同的無序字母對個數有限,n的規模可以通過計算得到
此題把尤拉路徑的問題進行了字母話。我們可以直接將字母轉換成ascii碼來解決問題。值得注意的是要判斷是否存在尤拉路徑以及運算n(**中我用的m)的取值範圍。 剩餘的部分就是常規的尤拉路徑的查詢(詳見尤拉路徑)。
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=5005;
struct shu
;vector
a[maxn];
int n=500,m,du[maxn];
vector
d;int vis[1030];
bool fnd[200]=;
bool my(shu x,shu y)
); //直接將字母當成數字來儲存
a[s[1]].push_back((shu));
du[s[1]]++;
du[s[0]]++;
fnd[s[0]]=1; //標記哪些字母出現過,以方便下面的查詢。
fnd[s[1]]=1;
}for(int i=1;i<=n;i++)
sort(a[i].begin(),a[i].end(),my);
}void dfs(int i)
d.push_back(i);
}int main()
int ok1=0,ok2=0;
for(int i=1;i<=n;i++)
if(du[i]%2)
dfs(s);
if(ok1!=0&&ok1!=2) //尤拉路徑中度為奇數的點要麼有2個有麼沒有。
for(int i=d.size()-1;i>=0;i--)
printf("%c",d[i]);
return
0;}
無序字母對
題目描述 給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串中出現。輸入輸出格式 輸入格式 第一行輸入乙個正整數n。以下n行每行兩個字母,表示這兩個字母需要相鄰。輸出格式 輸出滿足要求的字串。如果沒有滿足要求的字串...
無序字母對
剛開始學尤拉迴路,因為不太理解導致 wa 了兩次。錯點 度數為奇數個的點數大於2時不存在尤拉路徑 是偶數個也不行 如果存在尤拉路徑而不是尤拉迴路時,不能隨便選乙個點當做起點,必須選度數為奇數的兩個點中的乙個。include include includeusing namespace std con...
無序字母對
傳送門 一道非常不錯的尤拉迴路 路徑 題 我們已經知道怎麼求尤拉迴路 路徑 了,但是如果求字典序最小的呢?求尤拉迴路是乙個深搜的過程 所以我們不如每次在向下乙個點深搜的時候,每次讓他先走那個字典序最小的節點,這樣我們就能保證字典序最小了。不過實際上這個用鄰接表實現會很麻煩。我的實現方法是,對於所有的...