剛開始學尤拉迴路,因為不太理解導致\(wa\)了兩次。
錯點:度數為奇數個的點數大於2時不存在尤拉路徑(是偶數個也不行)。
如果存在尤拉路徑而不是尤拉迴路時,不能隨便選乙個點當做起點,必須選度數為奇數的兩個點中的乙個。
#include#include#includeusing namespace std;
const int n = 100005;
int n,dis[200][200],fa[n],st[n],top;
int cnt,ans[n],t,s=200,du[n],sum;
char x[n],y[n];
int find(int x)
int main()
int zx=find(s);
for(int i=1;i<=n;i++) }
for(int i=1;i<=150;i++)
if(du[i]&1) ++cnt;
if(cnt==1||cnt>2)
for(int i=1;i<=150;i++)
if(du[i]&1)
st[++top]=s;
while(top>0)
if(v>0)
else
}if(t>n+1)
for(int i=t;i;i--)
cout<<(char)ans[i];
return 0;
}
在一本通上看見一道很巧妙的題。
有\(n\)個盤子,每個盤子上寫著乙個僅由小寫字母組成的英文單詞。你需要給這些盤子安排乙個合適的順序,使得相鄰兩個盤子中,前乙個盤子的單詞的末字母等於後乙個盤子上單詞的首字母。
\(n<=100000\)
思路分析(當然是書上的):
以26個字母作為頂點,對於每乙個盤子,如果它的首字母為\(c1\),末字母為\(c2\),那麼從\(c1\)向\(c2\)連一條有向邊。這樣問題轉化為在圖中尋找一條不重複的經過每一條邊的路徑,即尤拉路徑。
(一定有迴路,如果不保證先判斷一下)
尤拉迴路板子:
#include#include#include#includeusing namespace std;
const int n = 1000010;
int head[n],tot,stack[n],ans[n];
bool vis[n];
int n,m,top,t;
struct edgee[n<<1];
void add(int x,int y)
void euler()
else
}}int main()
euler();
for(int i=t;i;i--)
printf("%d\n",ans[i]);
return 0;
}
無序字母對
問題描述 給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串中出現。輸入格式 第一行輸入乙個正整數n。以下n行每行兩個字母,表示這兩個字母需要相鄰。輸出格式 輸出滿足要求的字串。如果沒有滿足要求的字串,請輸出 no...
無序字母對
題目描述 給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串中出現。輸入輸出格式 輸入格式 第一行輸入乙個正整數n。以下n行每行兩個字母,表示這兩個字母需要相鄰。輸出格式 輸出滿足要求的字串。如果沒有滿足要求的字串...
無序字母對
傳送門 一道非常不錯的尤拉迴路 路徑 題 我們已經知道怎麼求尤拉迴路 路徑 了,但是如果求字典序最小的呢?求尤拉迴路是乙個深搜的過程 所以我們不如每次在向下乙個點深搜的時候,每次讓他先走那個字典序最小的節點,這樣我們就能保證字典序最小了。不過實際上這個用鄰接表實現會很麻煩。我的實現方法是,對於所有的...