題意:給你n個由小寫字母組成的單詞,要求將這n個單詞連線起來,使得前乙個單詞的最後乙個字母和後乙個單詞的第乙個字母相容,輸出字典序最小的解
思路:不難發現此題可以轉化為尤拉路徑問題,把每個字串的第乙個字母當作起點,最後乙個字母當作終點,連一條有向邊,求此圖字典序最小的尤拉路徑。
對於有向圖來說,存在一條尤拉路徑的充要條件為此圖聯通並且要麼對於每個頂點都有出度等於入度,要麼有且僅有乙個頂點出度比入度少1,有且僅有乙個頂點入度比出度少1,其餘頂點出度等於入度。
對於聯通性的判斷來說,直接用dfs即可,只要能把所有的邊都遍歷到,此圖就是聯通的。當然也可以用並查集判斷聯通。
對於字典序最小的要求,只需把給定的所有字串排序,按照字典序從小到大的順序加邊即可。
**如下
#include#include#include#include#includeusing namespace std;
string s[1005];
int in[26],out[26];
struct node
node(){}
};vectorg[26];
int ans[1005];
int cnt=0;
void dfs(int now)
int d1=0,d2=0;
for(int i=0;i<26;i++)
else if(in[i]-out[i]==1)
else if(out[i]-in[i])
}if(!(d1==1&&d2==1||d1==0&&d2==0))
cnt=0;
dfs(st);
if(cnt!=n)
for(int i=cnt;i>=1;i--)
}return 0;
}
poj1386 尤拉迴路)
題目鏈結 解題思路 把每個單詞當成是一條有向邊。把首字母和尾字母當成是節點,如果該字母是乙個單詞的首字母,該字母的入度就加一,如果是尾字母,該字母的出度就加一。然後判斷是否形成尤拉迴路即可。尤拉路徑判斷條件 首先該圖必須是連通圖。對於無向圖,所有頂點的讀都為偶數,對於有向圖,要麼所有頂點的入度等於出...
POJ 1041 尤拉迴路
題意 john要去訪問他的朋友,在這個城市中有n條街道,每條街道與別的街道有兩個交點,現在給出這些街道的資訊 即輸入x y z表示街道z的兩個端點為x,y 問其是否可以每條街道只經過一次,如果存在,則輸出字典序最小的路線,不存在則輸出 round trip does not exist.注意 是邊的...
尤拉迴路 輸出尤拉迴路的路徑
有向or無向均可,重邊 step1 從u開始,找到與他相連的v,放入棧,刪除 u,v 這條邊,然後從v開始 step2 當有一點沒有與他相連的點時,放入path,然後從stack取棧頂繼續開始找點刪邊。最後記得把棧裡的點放到path中。path倒序輸出 需要先找到起點 鄰接表法,適合稀疏圖 incl...