輸入n(n≤100000)個單詞,是否可以把所有這些單詞排成乙個序列,使得每個單詞的第乙個字母和上乙個單詞的最後乙個字母相同(例如acm、malform、mouse)。每個單詞最
多包含1000個小寫字母。輸入中可以有重複單詞。
可以看出, 把字母看成頂點(最多26個), 然後單詞就是有向邊, 單詞與單詞之間的關係就連線起來了, 然後建立鄰接矩陣, 自環的可以忽略, 記錄輸入的字母有哪幾個, 字母的度數。
然後圖中存在尤拉通路的條件有2個
(1) 連通(我用了dfs來判斷)
(2) 要麼沒有奇度頂點, 如果有, 那麼肯定是有乙個入度-出度=1 有乙個入度-出度= -1。
用好這兩個條件就可以判定應該就可以得出答案了
1 #include 2using
namespace
std;
3int degree[26],used[26];//
度數 有沒有使用過
4int g[26][26];//
鄰接矩陣
5intn;6
int id(inta)9
int vis[26
];10
void dfs(int
u)16}17
}1819bool
judge()27}
28for(int i = 0; i < 26; i++)//
此時u就要等於入度》出度的頂點了
32else
if(degree[i] == -1)
33else
return
false;34
}35}36
}37if((num1 || num2) && num1 + num2 != 2) return
false;//
如果有 而且不是只有2個 就可以判為false了
3839 memset(vis,0,sizeof
(vis));
40dfs(u);
41for(int i = 0; i < 26; i++)45}
46return
true;47
48}49int
main()
64 used[s1 -'
a'] = 1
;65 used[s2 -'
a'] = 1
;66 degree[id(s1)]++;//
出度++
67 degree[id(s2)]--;//
入度--68}
69//
for(int i = 0; i<26; i++)
73 printf("
%s\n
", judge()? "
ordering is possible.
":"the door cannot be opened.");
74}75 }
UVA10129 尤拉道路
題目 輸入n n 100000 個單詞,是否可以把所有這些單詞排成乙個序列,使得每個單詞的第乙個字母和上乙個單詞的最後乙個字母相同 例如 acm,malform,mouse 每個單詞最多包含1000個小寫字母。輸入中可以有重複單詞。解題思路 把字母看作結點,單詞看作有向邊,則問題有解等價於圖中存在尤...
UVa 10129單詞(尤拉迴路)
題意是輸入n個單詞,是否可以把所有這些單詞排成乙個序列,使得每個單詞的第乙個字母和上乙個單詞的最後乙個字母相同。輸入中可以有重複單詞。由於最後只需要判斷是否能排成這樣的乙個序列,所以沒有輸入單詞後,只需要把首尾字母儲存下來,然後可以dfs深度遞迴。由於可能會有重複單詞,在這裡可以設乙個times陣列...
Uva 10129 玩弄單詞
問題描述 有一些秘密的門包含著非常有趣的單詞迷題,考古學家隊伍必須解決它們才能夠開啟大門。因為沒有其他方法能開啟這些門,所以解決那些迷題對我們非常重要。在每個門上有很多個有磁力的n個盤子,盤子上面寫著單詞。必須重新移動放置這些盤子,讓它們形成乙個佇列 佇列中,除了第乙個單詞,每個單詞的開頭和上乙個單...