u016 無序字母對

2021-09-28 10:05:21 字數 1226 閱讀 6471

time limit: 1 second

memory limit: 128 mb

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

第一行輸入乙個正整數n。 以下n行每行兩個字母,表示這兩個字母需要相鄰。

輸出滿足要求的字串。 如果沒有滿足要求的字串,請輸出「no solution」。 如果有多種方案,請輸出前面的字母的ascii編碼盡可能小的(字典序最小)的方案

4

aztz

xtax

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

把兩個字母看做邊的兩端點。則所輸入的n個字母對就是n條邊。所求的字串就是這n條邊構成的圖的尤拉路徑。這裡說的n+1個字元。如果它不是一條鏈。則一定是存在乙個環的。

然後用存在尤拉路的定理先判定會不會有尤拉路;

即統計所有點的出度的奇偶個數。

如果奇數的出度數總數為0(全是偶數)或2.則存在尤拉路。

如果全是偶數。就從字典序最小的乙個點開始dfs找就可以。

如果有兩個奇數的點。就從字典序較小的那個奇數點開始dfs。

是一定能找到的。鏈的情況也可以包括。

其他情況都可以用尤拉圖定理排除掉。

【**】

#include #include int a[256][256] = , n, w[256][256] = ,chudu[256];

char temp[256];

void dfs(int x, int now)//現在到達x頂點。下乙個點是第now個點

for (int i = 1;i<= 255;i++)//尋找x的出度。並記錄這個出度

if (w[x][i] == 1) }

int main()

} int jishu = 0,start = 0;//統計奇數出度的個數。以及從**開始進行dfs.

for (int i = 1; i <= 255; i++) }

if (jishu != 0 && jishu != 2)//如果不全為偶數且奇數點的個數不為2.則輸出無解資訊。

temp[1] = start;//否則從開始點開始搜尋尤拉路徑 記錄路徑。

dfs(start,2);

return 0;

}

無序字母對

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

無序字母對

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

無序字母對

剛開始學尤拉迴路,因為不太理解導致 wa 了兩次。錯點 度數為奇數個的點數大於2時不存在尤拉路徑 是偶數個也不行 如果存在尤拉路徑而不是尤拉迴路時,不能隨便選乙個點當做起點,必須選度數為奇數的兩個點中的乙個。include include includeusing namespace std con...