UVa 10129 單詞 (尤拉通路)

2022-08-17 02:00:21 字數 1510 閱讀 2214

輸入n(n≤100000)個單詞,是否可以把所有這些單詞排成乙個序列,使得每個單詞的第乙個字母和上乙個單詞的最後乙個字母相同(例如acm、malform、mouse)。每個單詞最

多包含1000個小寫字母。輸入中可以有重複單詞。

可以看出, 把字母看成頂點(最多26個), 然後單詞就是有向邊, 單詞與單詞之間的關係就連線起來了, 然後建立鄰接矩陣, 自環的可以忽略, 記錄輸入的字母有哪幾個, 字母的度數。

然後圖中存在尤拉通路的條件有2個

(1) 連通(我用了dfs來判斷)

(2) 要麼沒有奇度頂點, 如果有, 那麼肯定是有乙個入度-出度=1 有乙個入度-出度= -1。

用好這兩個條件就可以判定應該就可以得出答案了

1 #include 2

using

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個盤子,盤子上面寫著單詞。必須重新移動放置這些盤子,讓它們形成乙個佇列 佇列中,除了第乙個單詞,每個單詞的開頭和上乙個單...