NYOJ 99 單詞拼接 尤拉迴路

2021-07-31 06:43:55 字數 1769 閱讀 9536

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:5 描述

給你一些單詞,請你判斷能否把它們首尾串起來串成一串。

前乙個單詞的結尾應該與下乙個單詞的道字母相同。

如aloha

dogarachnid

gopher

tiger

rat可以拼接成:aloha.arachnid.dog.gopher.rat.tiger

輸入第一行是乙個整數n(0輸出

如果存在拼接方案,請輸出所有拼接方案中字典序最小的方案。(兩個單詞之間輸出乙個英文句號".")

如果不存在拼接方案,則輸出

***

樣例輸入

2

6aloha

arachnid

doggopher

rattiger

3oak

maple

elm

樣例輸出

aloha.arachnid.dog.gopher.rat.tiger

***

如果滿足題意,那麼資料一定可以構成尤拉迴路,尤拉迴路的條件是: 所有點的入度和出度相等;尤拉路徑的條件是:滿足尤拉迴路條件或者圖中最多有乙個點入度比出度大1,至多有乙個點出度比入度大一,如果滿足以上條件,再進行dfs深搜找出一條路徑,然後輸出,如果找不到則不存在

實上這道題把給的單詞轉化成乙個圖,然後考察這個圖是否具有乙個尤拉迴路。

乙個圖具有尤拉迴路的充要條件是這個圖是連通的,並且只有0或2個奇點。出度比入度大一的作為起點,出度比入度小一的作為終點。

把字元抽象出來,單獨的乙個字元作為乙個節點,來考慮出度和入度。如果乙個字元出現在字串首,那它的出度就+1,該字元通過這個字串可以到達字串尾的那個字元;如果出現在字串尾,入度加1,字串首的字元可通過該字串達到該字元。

要用遞迴,這樣節省空間,並且這裡的話,遞迴的效率挺好的。

#include#include#includechar str[1000][31];

bool used[1000];

int in[26];

int out[26];

int s[1000];//在judge中用來存放每個字串的大小size

int stack[1000];

int n;

int compare(const void *a, const void *b)

int judge()

} if(first > -1 && last > -1)

return first;

else if(first == -1 && last == -1)

else

return -1;

}bool dfs(char first, int index)//有可能有多個連通區域

if(b > e)

return false;

//找到這個字元第一次出現的字串

while(str[m][0] == first && m >= 0)

--m;

for(i = m + 1; str[i][0] == first; ++i) }

return false;

}int main()

first = judge();

if(first != -1 && dfs(first + 'a', 0))

else

printf("***\n");

}}

NYOJ 99 單詞拼接 尤拉迴路或路徑

題目傳送門 思路 單詞頭的字母為乙個入讀,尾為乙個出度,先判斷能不能形成尤拉路徑 條件 因為這是有向圖,起始點的in比out大1,終點的out比in大1,只有這兩個點的in和out是不一樣,其他點的in和out的一樣的,所以同時找到起點。如果是迴路的話,找個有out的當起點就行,當然要按著字典序!然...

nyoj 99 單詞拼接 euler, dfs

記憶體限制 64mb 時間限制 3000ms 特判 no 通過數 7 提交數 14 難度 5 給你一些單詞,請你判斷能否把它們首尾串起來串成一串。前乙個單詞的結尾應該與下乙個單詞的道字母相同。如aloha dogarachnid gopher tiger rat可以拼接成 aloha.arachni...

UVa 10129單詞(尤拉迴路)

題意是輸入n個單詞,是否可以把所有這些單詞排成乙個序列,使得每個單詞的第乙個字母和上乙個單詞的最後乙個字母相同。輸入中可以有重複單詞。由於最後只需要判斷是否能排成這樣的乙個序列,所以沒有輸入單詞後,只需要把首尾字母儲存下來,然後可以dfs深度遞迴。由於可能會有重複單詞,在這裡可以設乙個times陣列...