洛谷1341 無序字母對 解題報告

2021-07-14 16:49:34 字數 1199 閱讀 5339

【問題描述】  

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

【輸入格式】  

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

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

【輸出格式】  

輸出滿足要求的字串。

如果沒有滿足要求的字串,請輸出「no solution」。

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

【輸入樣例】   4az

tzxt

ax【輸出樣例】  

xaztx

【資料範圍】  

不同的無序字母對個數有限,n的規模可以通過計算得到

解題思路:根據題意可以把該題與尤拉路徑聯絡起來,將字母通過ascii碼轉化為數字,看作圖的頂點,每次輸入的第乙個字母到第二個字母連一條無向邊。判斷輸入所得的圖是否有尤拉路徑,如有則輸出尤拉路徑的字典序最小方案。需要注意的是,為了計算尤拉路徑,需用邊集陣列來進行儲存,在輸入完成後,應將每個點發出的邊,按字典序由小到大排序,輸出時需按照後序序列逆序輸出。判斷是否有尤拉路徑時,可以根據尤拉路徑的性質,無向圖中要麼所有點的度為偶數(尤拉迴路),要麼只有兩個點的度為奇數(尤拉路徑)進行判斷。對於n的範圍宜多不宜少。

#include#include#include#include#include#include#includeusing namespace std;

const int maxn=1005;

int n;

char s[5];

struct edge;

vectorg[60]; //運用邊集陣列建立儲存結構

int du[60],vis[maxn],vis1[60];

vectoreg;

bool cmp(edge aa,edge bb)

for(int i=1;i<60;i++)

if(du[i]%2==1)

memset(vis,0,sizeof(vis));

dfs(s);

for(int i=eg.size()-1;i>=0;i--) //注意逆序輸出

printf("%c",eg[i]-1+'a');

} return 0;

}

洛谷 P1341 無序字母對

這道題第一眼以為是一道字串的題,但細想一下是一道求尤拉路的圖論題。把每一對對應關係看成一條邊,本題即求這張圖上是否存在乙個尤拉迴路或尤拉路,並要求字典序最小的方案,那麼我們在dfs的時候就要從該點所連的最小的點開始便利,並將所得的結果存在乙個陣列中,最後逆序輸出。include include in...

洛谷P1341 無序字母對

給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串 現。不同的無序字母對個數有限,n的規模可以通過計算得到。各不相同的無序字母對總數有限,有52 51 2 1326種,這是n的規模。此題的建模是圖論,給出的無序字母...

洛谷P1341 無序字母對

題目鏈結 根據題意,只有在每兩個相鄰的字母都構成乙個要求的無序字母對時,才能滿足要求,我們不妨將每個字母看成乙個節點,每個無序字母對看成乙個無向邊,我們要從乙個點出發,不重複地走完所有的邊,所走的路徑上的點構成的字串即為乙個合法的解 這就轉化成了求一條字典序最小的尤拉路徑 字典序就用堆搞一下就行了 ...