【問題描述】
有一些秘密的門包含著非常有趣的單詞迷題, 考古學家隊伍必須解決它們才能夠開啟大門。 因為沒有其他方法能開啟這些門, 所以解決那些迷題對我們非常重要。
在每個門上有很多個有磁力的n個盤子,盤子上面寫著單詞。 必須重新移動放置這些盤子,讓它們形成乙個佇列:佇列中,除了第乙個單詞,每個單詞的開頭和上乙個單詞的結尾字母一樣。例如, motorola的後面可以接上acm。
你的任務是寫乙個程式, 讀入一系列單詞,然後計算確定它們是否有可能被排成這樣的佇列。
【輸入格式】
第一行是測試資料組數t,每組資料的第一行是乙個整數n,表示有n個盤子(編號為1..n),接下來的n行每行乙個單詞,表示盤子上的的單詞。
【輸出格式】
每組資料輸出一行,如果能排成題目要求的佇列,則輸出「ordering is possible.」,否則輸出「the door cannot be opened.」
【輸入樣例】
3 2
acm
ibm
3 acm
malform
mouse
2 ok
ok【輸出樣例】
the door cannot be opened.
ordering is possible.
the door cannot be opened.
【資料範圍】
1<=n<=100000,每個單詞最多包含1000個小寫字母
乍一讀題,感覺是乙個簡單題,這不就是成語接龍嗎?接龍的過程,也就是求滿足前乙個單詞的尾字母和後乙個單詞的首字母相同的乙個排列。
暴力的想法就是,排列生成,乙個乙個去試,看能不能接上龍。
先不說剪不剪枝了,排列生成的時間複雜度都是n!級別的,針對n=100000基本沒法做。暴力的去搞顯然不行。
但是接龍的時候,接上的單詞之間都是滿足前乙個單詞的尾字母和後乙個單詞的首字母相同的。這讓所求排列中的元素之間有了一種鏈條一樣的關係。所以建立圖論模型來解決問題。
根據單詞間的相關性,有兩種設法:
模型1.以單詞為圖的頂點,若單詞a和單詞b能連線,則從a向b引一條有向邊。
然而不幸的是n可以達到100000,這樣就建立了乙個10w個頂點的圖,邊數更是可能遠大於10w,還是太慢。
注意到接龍只注意首尾,單詞中間是可以捨去的,我們並沒有必要把每個單詞和它們之間的關係(邊)存下來,我們只要把首尾字母記下來,用首尾字母的連線表示每乙個以這兩個字母作為首尾字母的單詞即可。
模型2.以字母為點,以單詞為有向邊。
判斷是否成立,只需要判斷圖是否有尤拉路徑即可。
由於這個圖是有向的,故存在尤拉路徑的條件是:
1)圖要基連通(忽略所有邊的方向後,dfs判定圖是否只有乙個連通分量)
2)所有點的入度於出度相等或者有乙個點出度比入度多1,還有乙個點的入度比出度多1。
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=30;
int t,n,cnt=0;
char str[1005];
vector
g[maxn];
int vis[maxn],vis2[maxn];
int rd[maxn],cd[maxn];
void dfs(int i)//dfs訪問有向圖轉成的無向圖各結點,通過訪問結點個數判斷是否基連通
}int main()
}int nn=0;
for(int i=1;i<=26;i++)if(vis[i])
nn++;
cnt=0;
memset(vis2,0,sizeof(vis2));
for(int i=1;i<=26;i++)if(vis[i])
if(cnt!=nn) printf("the door cannot be opened.\n");//不是基連通
else
if(ok1)printf("ordering is possible.\n");
else
if(cnt1==1 && cnt2==1 && sum<=2)printf("ordering is possible.\n");
else
printf("the door cannot be opened.\n");}}
}return
0;}
UVa 10129單詞(尤拉迴路)
題意是輸入n個單詞,是否可以把所有這些單詞排成乙個序列,使得每個單詞的第乙個字母和上乙個單詞的最後乙個字母相同。輸入中可以有重複單詞。由於最後只需要判斷是否能排成這樣的乙個序列,所以沒有輸入單詞後,只需要把首尾字母儲存下來,然後可以dfs深度遞迴。由於可能會有重複單詞,在這裡可以設乙個times陣列...
UVa 10129 單詞 (尤拉通路)
輸入n n 100000 個單詞,是否可以把所有這些單詞排成乙個序列,使得每個單詞的第乙個字母和上乙個單詞的最後乙個字母相同 例如acm malform mouse 每個單詞最 多包含1000個小寫字母。輸入中可以有重複單詞。可以看出,把字母看成頂點 最多26個 然後單詞就是有向邊,單詞與單詞之間的...
UVA10129 尤拉道路
題目 輸入n n 100000 個單詞,是否可以把所有這些單詞排成乙個序列,使得每個單詞的第乙個字母和上乙個單詞的最後乙個字母相同 例如 acm,malform,mouse 每個單詞最多包含1000個小寫字母。輸入中可以有重複單詞。解題思路 把字母看作結點,單詞看作有向邊,則問題有解等價於圖中存在尤...