洛谷P1341 無序字母對

2022-05-05 21:24:09 字數 1304 閱讀 9899

題目鏈結

根據題意,只有在每兩個相鄰的字母都構成乙個要求的無序字母對時,才能滿足要求,

我們不妨將每個字母看成乙個節點,每個無序字母對看成乙個無向邊,

我們要從乙個點出發,不重複地走完所有的邊,

所走的路徑上的點構成的字串即為乙個合法的解

這就轉化成了求一條字典序最小的尤拉路徑

字典序就用堆搞一下就行了

如何判斷是否存在尤拉路徑:

對於無向圖,

尤拉圖(存在尤拉迴路):該圖是連通的且每個點的度數都是偶數

半尤拉圖(存在尤拉路徑):該圖連通且僅有兩個點的讀數是奇數,這兩個點即為尤拉路徑的起始點

對於有向圖:

尤拉圖:該圖的基圖是連通的且所有點的入度等於出度

半尤拉圖:該圖的基圖是連通的且只有乙個點的入度比出度少1(起點),只有乙個點的入度比出度多1(終點)

**:

#include#include

#include

#include

using

namespace

std;

#define n 55

#define m 6010

int n=52

,m,du[m],path[m],num;

int head[n],to[m],next[m],cnt=1

;bool

u[n],vis[n],cut[m];

inline

int pos(char

c)inline

char map(int

x)struct

cmp};

inline

void add(int x,int

y)void dfs(int

t) }

path[++num]=t;

}int

main()

bool f=0; int st=0,tot=0

;

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

if(tot>2

) }

}if(tot==0

)

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

if(u[i])

vis[st]=1

; dfs(st);

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

if(u[i]&&!vis[i])

num++;

while(--num)

putchar(map(path[num]));

return0;

}

洛谷 P1341 無序字母對

這道題第一眼以為是一道字串的題,但細想一下是一道求尤拉路的圖論題。把每一對對應關係看成一條邊,本題即求這張圖上是否存在乙個尤拉迴路或尤拉路,並要求字典序最小的方案,那麼我們在dfs的時候就要從該點所連的最小的點開始便利,並將所得的結果存在乙個陣列中,最後逆序輸出。include include in...

洛谷P1341 無序字母對

給定n個各不相同的無序字母對 區分大小寫,無序即字母對中的兩個字母可以位置顛倒 請構造乙個有n 1個字母的字串使得每個字母對都在這個字串 現。不同的無序字母對個數有限,n的規模可以通過計算得到。各不相同的無序字母對總數有限,有52 51 2 1326種,這是n的規模。此題的建模是圖論,給出的無序字母...

洛谷P1341 無序字母對

題目大意 見原題目描述,說的很清楚。演算法 圖論 尤拉路徑 思路 題目資料中沒有重複條件,因此成功得到解有兩種可能。n個點,n條路徑,形成尤拉迴路 沒有奇數點 n 1個點,n條路徑,形成尤拉路徑 只有2個奇數點 因此先判斷是否有解,如果有就用dfs搜尤拉路徑 迴路 即可。我這裡給每個字母都進行了編號...