洛谷P1341 無序字母對

2022-05-19 11:24:13 字數 1057 閱讀 3579

題目大意:見原題目描述,說的很清楚。

演算法:圖論、尤拉路徑

思路:題目資料中沒有重複條件,因此成功得到解有兩種可能。①n個點,n條路徑,形成尤拉迴路(沒有奇數點);②n+1個點,n條路徑,形成尤拉路徑(只有2個奇數點)。因此先判斷是否有解,如果有就用dfs搜尤拉路徑(迴路)即可。

我這裡給每個字母都進行了編號,使用時可以編號和原字母互相轉換。

c++ code:

#include#include#include#include#define n 3000

using namespace std;

int n,m=0;

bool b[n][n];

int ctoi[n],hasr[n],odd1,odd2,odds;

char itoc[n],s[3],inp[n],ans[n];

void dfs(int now,int p)

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

if(b[now][ctoi[inp[i]]])

ans[p]='\0';

}int main()

if(!ctoi[s[1]])

b[ctoi[s[1]]][ctoi[s[0]]]=b[ctoi[s[0]]][ctoi[s[1]]]=true;

hasr[ctoi[s[0]]]++;

hasr[ctoi[s[1]]]++;

} sort(inp+1,inp+m+1);

odds=0;

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

if(hasr[i]%2)

} if(odds!=0&&odds!=2)

int start;

if(odds==2)

else

start=ctoi[inp[1]];

memset(ans,'\0',sizeof ans);

dfs(start,1);

return 0;

}

洛谷 P1341 無序字母對

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

洛谷P1341 無序字母對

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

洛谷P1341 無序字母對

題目鏈結 根據題意,只有在每兩個相鄰的字母都構成乙個要求的無序字母對時,才能滿足要求,我們不妨將每個字母看成乙個節點,每個無序字母對看成乙個無向邊,我們要從乙個點出發,不重複地走完所有的邊,所走的路徑上的點構成的字串即為乙個合法的解 這就轉化成了求一條字典序最小的尤拉路徑 字典序就用堆搞一下就行了 ...