Catenyms (尋找有向尤拉路 輸出路徑)

2021-08-15 01:33:21 字數 1452 閱讀 1251

題目鏈結

大意:給你一串單詞,首尾相同的單詞才能相連,存在的話按字典序最小的輸出。(單詞的首尾暗示了這是乙個有向圖)

思路:本題的目的是考察找有向圖存在尤拉迴路的條件,(1.如果圖連通,且每個點的出度等於入度,則存在尤拉迴路 2 .如果圖連通,且恰有一點u的出度比入度大1,另有一點v的出度比入度小1,其餘的出度等於入度,則存在尤拉路,起點u終點v),用並查集來判斷。

然後我們要考慮字典序是最小的,所以要提前排序,用edges【i】存放第i條邊。lujing【】用來逆序存放邊。

在判斷時很多地方寫得很巧妙,建議仔細斟酌。條件判斷的時候也不能遺漏。

**(從1開始的這種寫法一直wa,暫未找到根源所在。。請見第二份**)

#include#include#include#includeusing namespace std;

const int maxn=1000+10;

int fa[27];

int mark[27];

int m;

int in[30];

int out[30];

int lujing[maxn];

int start;

int lala;

int findset(int i)

void init()

struct e

edges[maxn];

struct words

}words[maxn];

int judge()//判斷是否弱連通}}

return cnt==1;

}void euler(int startt)

}}int main()

sort(words,words+m);

for(int i=1;i<=m;i++)

}int start=edges[0].u;

int count1=0,count2=0;

int i;

for( i=1;i<=26;i++)

else

break;}}

// cout<=1;i--)

}words[maxn];

struct edge

edges[maxn];

int fa[26+5]; //並查集

int in[26+5],out[26+5];//入度,出度

bool mark[26+5]; //mark[i]=true,表i這個字母被用到作為圖頂點了

int m;//單詞數,即邊數

int cnt,ans[maxn];//記錄輸出單詞的序號,逆序

int findset(int u)

bool ok()//判斷是否弱連通圖

void euler(int u)

else printf("***\n");

}return 0;

}

Catenyms(尤拉通路)

題目 分析 根據題目的意思可以想到兩個方向 把字串當做點,兩點能形成接龍形式則連一條有向邊,這是問題變成求一條點不重複的路且經過每乙個點。這就像乙個路徑覆蓋問題,但是圖上各種多重邊讓筆者不知道怎麼搞所以放棄這個想法 把字串當做邊,以26個字母為頂點建圖,問題變成求邊不重複的路且經過每一條邊,顯然這是...

poj 2337 Catenyms 尤拉路徑

poj 2337 題意 給你一些單詞,單詞a的結尾若等於單詞b的開頭,就可以連線ab,要求把所有單詞連線起來,如果情況有多種,要求字典序最小,如果不能連線所有單詞,輸出 思路 這個題看起來是求哈密頓路,實則求尤拉路,把每個單詞的開頭和結尾當做一條邊連線起來,那麼在這個有向圖中,存在尤拉路則有解,不過...

poj 2337 Catenyms 尤拉路徑

題意 給定一些單詞,假設乙個單詞的尾字母與還有乙個的首字母同樣則能夠連線。問能否夠每乙個單詞用一次,將全部單詞連線,能夠則輸出字典序最小的序列。bin 神的板子 include include include include include include include include inclu...