無序字母對

2021-07-14 16:44:29 字數 1439 閱讀 2820

【問題描述】

給定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...

無序字母對

傳送門 一道非常不錯的尤拉迴路 路徑 題 我們已經知道怎麼求尤拉迴路 路徑 了,但是如果求字典序最小的呢?求尤拉迴路是乙個深搜的過程 所以我們不如每次在向下乙個點深搜的時候,每次讓他先走那個字典序最小的節點,這樣我們就能保證字典序最小了。不過實際上這個用鄰接表實現會很麻煩。我的實現方法是,對於所有的...