nyoj 單詞拼接(並查集判斷連通性+歐拉路徑)
這題還是比較難的。
首先建圖方面,如果單純的把單詞作為點,能拼接的關系作為邊,那麼就是哈密頓圖(每個點僅能走一次),難度比較大。
換一種思路,就是把每個單詞看成一條有向邊,由該單詞的首字母指向尾字母。
那麼這題便是歐拉圖的問題了。
本質上采用的還是搜索,但是為了快速得到字典序最小的歐拉路徑,首先要對單詞集進行排序。
排完序後,用邊集數組存圖;再通過計算各點的出度與入度,同時判斷基圖(不考慮邊的方向的圖)的連通性,判斷是否存在歐拉回路或歐拉通路。
如果存在歐拉回路,那麼就從0開始搜索;
如果存在歐拉通路,那麼就從“出度=入度+1”的點開始搜索。
參考代碼如下:
邊集數組存圖+並查集判斷連通性
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include