USACO演算法系列十四 fence

2021-05-23 17:47:47 字數 1426 閱讀 9472

題目:http://www.nocow.cn/index.php/translate:usaco/fence

看完這道題目的第一想法就是,遍歷所有的邊,而且每一條邊的經過次數只能一次。是離散數學裡面的圖論的尤拉通路問題,在這裡充分體現了數學的重要性。

定理:無向圖g有尤拉通路的充分必要條件是g為連通圖,並且g僅有兩個奇度結點或者無奇度結點。

(1)當g是僅有兩個奇度結點的連通圖時,g的尤拉通路必以此兩個結點為端點。

(2)當g是無奇度結點的連通圖時,g必有尤拉迴路。

因此第乙個點,要麼是最小的度數為奇數的點(如果存在),否則為是下標最小的點。

可惜的是,時間一直都是超時的,通不過去。

看了usaco的提示,他也是採用深度遍歷的方法,然後將結果逆序儲存列印。但是這個深度遍歷跟我的那個方法有著本質的區別,他的深度遍歷是遍歷邊,而我的深度遍歷是深度搜尋,時間複雜度不在乙個數量級上。很讓我奇怪的是,為什麼簡簡單單的一次深度遍歷邊,然後逆序儲存節點就可以找出尤拉通路呢?

舉個例子:

正確的尤拉通路順序是紅色的,但是按節點下標的深度遍歷的順序是藍色方式。很顯然如果從方向來看的話,二者的結果肯定是不同的。

我們先看一下**入下:

按照程式的執行思路跑一遍,可以得到如下步驟:

find(1):

map[1][2] = 1;

find(2)

map[2][3] = 1;

find(3)

map[3][4]=1;

find(4)

map[4][2]=1;

find(2) //此時所有的map[2][i] = 0

記錄2return;

所有map[4][i]=0

記錄4return

map[3][i] =0

記錄3return;

所有map[2][i]=0

記錄2return

map[1][5] = 1;

find(5)

map[5][6] = 1

find(6)

map[6][1] = 1;

find(1);

all map[1][i]=0;

記錄1return

記錄6return

記錄5return

記錄1return;

逆序列印結果是1 5 6 1 2 3 4 2,就是正確答案。

本來我也想不明白其中的緣由,但是如果把問題理解為實際上我們就是尋找乙個點序列,使得按照這個點序列遍歷邊,能經過每一條邊,並且只有一次。根據尤拉通路的從要條件,我們可以很明確的得到第乙個點(起點)s。那麼我們要確定的是下乙個尤拉通路的點p,是與起點連線的點中的哪乙個?那我們可以想一下,哪乙個點是下乙個尤拉點p呢?就是沿著s p然後經過深度遍歷,能夠將所有的邊都遍歷到的點就是尤拉點,就是經過sp往下深度遍歷以後,所有map【i】【j】=0。

執行結果如下:

USACO演算法系列十六 續

題目 http www.nocow.cn index.php translate usaco camelot 昨天晚上寫了乙個晚上的這道題,各種邊界條件和意外情況。看著自己寫的600多行 和一連串的test ok.心裡特別有成就感,但是看了別人寫的 80幾行,就發現了實力的差距。先說說自己的想法吧,...

USACO演算法系列 討論篇

這道題目來自於我同學的口述,大意是這樣,有n個房間,編號為1,2,3 n,裡面有1個寵物,然後你每次只能開啟乙個房間,如果沒有找到,寵物必須隨機向左向右移動一次,問你如何以最快的開門方式找到寵物。eg,有3個房間,那麼你只要至多開啟中間的房間兩次就可以找到寵物了。分析 用n個位來表示n個房間,0 代...

USACO演算法系列七 stamps

題目 郵票數可以顯示最大連線自然數的問題,看到這道題目第乙個想到的是整數劃分問題。但是又很不一樣。第一它不用考慮這個整數的所有劃分情況,而是只要考慮整數是否可以被 k個郵票表示。最簡單的想法,用stamp n 陣列表示郵票,然後遞增考慮1到k stamp n 範圍的自然數的劃分,直到不能劃分為止。為...