hdu4850(尤拉迴路的應用)

2021-06-25 11:58:40 字數 1501 閱讀 9148

題意:輸出乙個長度為n的由小寫字母並且長度大於4的單詞不能相同的字串

解題分析:首先能確定字串的長度最大 26^4 + 3 (初始態的三個字元)。建立圖的模型,將三個字元看成乙個結點,每個結點有26條出邊,得到26個新結點,這樣就構成了有26^3 個結點,邊有26^4 條邊。現在只要將每條邊遍歷一遍就可以了,這就是尤拉路徑,在這裡是乙個迴路,即尤拉迴路。注意,我們是從aaa出發的,為了遍歷所有的狀態,要把a字元的優先順序設定為最低。下面提供手寫棧和遞迴擴棧的**,建議用手寫棧。

**如下:

#include#include#include#include#include#includeconst int dig = 26;

const int n = dig*dig*dig;

#define inf 0x3f3f3f

#define pi acos(-1.0)

#define eps 10e-6

using namespace std;

char ans[n*dig+100];

bool vis[n][30];

int cnt[n];

int tot ;

int get_next(int cur,int i)

void init()

int temp = get_next(cur,iv);

if(cnt[temp] == 26) break;

vis[cur][iv] = 1;

cnt[temp]++;

ans[tot++] = (char)(iv+'a');

cur = temp;

}}int main()

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

printf("%c",ans[i]);

printf("\n");

}return 0;

}

#pragma comment (linker,"/stack:102400000,102400000")

#include#include#include#include#include#includeconst int dig = 26;

const int n = dig*dig*dig;

#define inf 0x3f3f3f

#define pi acos(-1.0)

#define eps 10e-6

using namespace std;

char ans[n*dig+100];

bool vis[n][30];

int tot ;

int get_next(int cur,int i)

void dfs(int cur)

}if(!vis[cur][0])

}int main()

printf("%s\n", (ans + 456979 - n));

}return 0;

}

HDU 尤拉迴路

problem description 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?input 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數n 1 n 1000 和邊數m 隨後的m行對應m條邊,每行給出...

HDU 1878 尤拉迴路(判斷尤拉迴路)

題目大意 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?解題思路 判斷無向圖是否存在尤拉迴路,判斷每個點的度數是否為偶數 並查集確認連通性。1 include2 include3 include4 define clr arr,val...

尤拉迴路(HDU 1878) 尤拉迴路模板題

題目鏈結 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是節點數n 1 n 1000 和邊數m 隨後的m行對應m條邊,每行給出一對正整數,分別是該條邊直接連通的兩個節點...