第一次寫部落格,以前一直沒有總結過,現在開始對自己學的東西做一些記錄吧,方便以後複習或者就當作留個腳印。
筆者目前大一,水平弱弱弱…有不正確的地方或者可以改進的地方還望指出。
找夥伴,有想一起學習的朋友可以一起交流交流。email: [email protected]
題目大意:輸入n個單詞,判斷是否能把所有單詞連線成乙個串,使得每個單詞首字母與前乙個單詞尾字母相同。
1:把每個單詞看作一座橋,二十六個英文本母看作節點,儲存成無向圖,還要記錄每個節點出度入度。
2:判斷整個有向圖的奇點數是否大於2,大於2則不存在尤拉道路,存在則走第三步。
3:判斷圖的連通性,筆者目前只會用dfs(並查集還沒學),看作無向圖(稍微提高效率)。若連通則存在尤拉道路。
思路講起來簡潔,然而每次實現都會遇到各種問題。(筆者太弱了)
若奇點數為2,判斷連通性的時候一定要注意起點是出度大於入度的那個節點。(如果要列印路徑)
若奇點數為0,(容易忽略)一定要找乙個存在橋的節點作為起點。
話不多說,直接上ac**。看了下各路大神的**,都這麼短!!!都不好意思貼上來了。
不太想寫注釋了,**如下。
#include#include#include#includeusing namespace std;
bool g[26][26];
int out_cnt[26],in_cnt[26];
void dfs(int in)
}}bool is_cncted(int in)
int main()
int sp_in=0,sp_cnt=0,flag=1;
for(int i=0; i<26; ++i)
if(in_cnt[i]!=out_cnt[i])
if(++sp_cnt>2||abs(in_cnt[i]-out_cnt[i])!=1)
else if(sp_cnt==1)
sp_in=i;
else if(in_cnt[sp_in]-out_cnt[sp_in]+in_cnt[i]-out_cnt[i])
if(flag)
for(int i=0; i<26; ++i)
if(out_cnt[i])
if(flag)
cout<<"ordering is possible."
cout<<"the door cannot be opened."<}
return 0;
}
Uva10129 尤拉迴路
play on wordsuva 10129 ordering is possible.the door cannot be opened.1 include2 include3 include4 const int maxn 26 5 using namespace std 6 7尤拉迴路 8圖是...
UVa 10129單詞(尤拉迴路)
題意是輸入n個單詞,是否可以把所有這些單詞排成乙個序列,使得每個單詞的第乙個字母和上乙個單詞的最後乙個字母相同。輸入中可以有重複單詞。由於最後只需要判斷是否能排成這樣的乙個序列,所以沒有輸入單詞後,只需要把首尾字母儲存下來,然後可以dfs深度遞迴。由於可能會有重複單詞,在這裡可以設乙個times陣列...
UVA 10129 尤拉迴路 判斷連通性
題意 輸入n個單詞,判斷是否可以使這些單詞排成一列,每個單詞的第乙個字母與上乙個單詞的最後乙個字母相同,最後乙個字母與下乙個單詞的第乙個字母相同 解法 以每個單詞的首尾字母為點,單詞為邊,dfs判斷圖的連通性,然後判斷是否存在尤拉通路 include using namespace std char...