無序字母對

2022-05-02 06:00:13 字數 1445 閱讀 1998

剛開始學尤拉迴路,因為不太理解導致\(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行每行兩個字母,表示這兩個字母需要相鄰。輸出格式 輸出滿足要求的字串。如果沒有滿足要求的字串...

無序字母對

傳送門 一道非常不錯的尤拉迴路 路徑 題 我們已經知道怎麼求尤拉迴路 路徑 了,但是如果求字典序最小的呢?求尤拉迴路是乙個深搜的過程 所以我們不如每次在向下乙個點深搜的時候,每次讓他先走那個字典序最小的節點,這樣我們就能保證字典序最小了。不過實際上這個用鄰接表實現會很麻煩。我的實現方法是,對於所有的...