落谷P1341無序字母對

2021-07-25 06:17:43 字數 1425 閱讀 5199

題目描述:

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

輸入格式:

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

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

輸出格式:

輸出滿足要求的字串。

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

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

輸入樣例#1:

4

aztz

xtax

輸出樣例#1:

xaztx

【資料規模與約定】

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

個人感覺這還是一道比較容易看出是是尤拉迴路的題目呢。。

首先,是否存在尤拉路的條件:

建圖:將字母作為圖的頂點,如果兩字母間存在字母對就在相應的字母所對應的頂點連上一條五向邊。

題目要求的是字典序最小的尤拉通路,怎麼辦呢?

首先來看看尤拉通路存在的條件:

1) 該連通圖的所有節點的度均為偶數。

2)該連通圖的奇點僅有兩個。存在一條尤拉路從其中乙個奇點出發,從另乙個奇點結束....

如果不滿足不滿足尤拉通路的條件直接就是「」no solution」

存在的話

那麼利用dfs就可以求出.題目還有乙個要求就是字典序最小,顯然如果度數為奇數的點為兩個,那麼這兩個點要麼就是起點或終點,因為是無向圖,所以不管是從起點出發還是從終點出發都是一樣的,所以選擇字典序小的一遍出發即可。。

**:

#include #include #include #include #include using namespace std;

const int maxn = 100;

int map[maxn][maxn], cnt[maxn], vis[maxn][maxn];

int n, maxm = 53;

stack ans;

int zhuanhua1(char c)

char zhuanhuan2(int x)

void euler(int u)

}int main()

int tot = 0, min1 = 1e8, min2 = 1e8;

for (int i = 0; i < maxm; i++)

else if (cnt[i])

min2 = min(min2, i);

}if (tot != 0 && tot != 2)

printf("no solution\n");

else

printf("\n");

}return 0;

}

P1341 無序字母對

給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串中出現。輸入格式 第一行輸入乙個正整數n。以下n行每行兩個字母,表示這兩個字母需要相鄰。輸出格式 輸出滿足要求的字串。如果沒有滿足要求的字串,請輸出 no solu...

P1341 無序字母對

給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串 現。輸入格式 第一行輸入乙個正整數n。以下n行每行兩個字母,表示這兩個字母需要相鄰。輸出格式 輸出滿足要求的字串。如果沒有滿足要求的字串,請輸出 no solut...

P1341 無序字母對

題目乍一看就是 dfs 拼接字母,但是資料量不一定純 dfs 暴力就能解決,所以我們換個角度,每個相同的字母可以連在一起,我們最終是要給他們連成乙個句子,那麼我們把每個相同的單詞看做節點,這就是個尤拉迴路啊。那麼這樣就好處理了,開始判斷,因為一共最多 52 個字母,所以只有 52 個點,我們記錄入度...