時間限制:
3000 ms | 記憶體限制:
65535 kb
難度:5 描述
給你一些單詞,請你判斷能否把它們首尾串起來串成一串。
前乙個單詞的結尾應該與下乙個單詞的道字母相同。
如aloha
dogarachnid
gopher
tiger
rat可以拼接成:aloha.arachnid.dog.gopher.rat.tiger
輸入第一行是乙個整數n(0輸出
如果存在拼接方案,請輸出所有拼接方案中字典序最小的方案。(兩個單詞之間輸出乙個英文句號".")
如果不存在拼接方案,則輸出
***
樣例輸入
26aloha
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陣列...