精 遞迴sap稍加優化堪比非遞迴

2021-06-14 03:53:31 字數 639 閱讀 6993

先看看遞迴的sap怎麼寫

int sap(int x,int flow)

if(h[1]>=n) return res;

if(!(--v[h[x]])) h[1]=n;

++v[++h[x]];

return res;

}

第13行表示發現斷層,設定全域性退出標誌 h[1]=n

然後每次執行到12層發現全域性退出標誌就退出

但是我們發現這並沒有起到多大的斷層優化作用(如果遇到此標記,不管退不退出,後面也就執行3句話也會退出)

所以我們要想辦法,一旦設定全域性退出標誌後就要盡快退出

那這一句話放那裡呢?

函式開頭?此時沒有res,那返回 0 ? 顯然不對!

一旦設定全域性退出標誌後後面的列舉邊就沒用了,所以我們可以換在for迴圈內

**如下

int sap(int x,int flow)

if(!(--v[h[x]])) h[1]=n;

++v[++h[x]];

return res;

}

這樣優化後的效率堪比非遞迴的效率!!!

【scoi2012奇怪的遊戲】效率比較

遞迴 遞迴演算法的非遞迴優化

一 遞迴 在方法內部呼叫自身方法的過程稱為遞迴,下面給出乙個遞迴方法的示例。class program 使用遞迴,實現求前n項和 public static int getsum int n int result getsum n 1 在方法體中呼叫方法本身 return result n 需要注意...

遞迴 從台階問題學習遞迴 遞迴優化和非遞迴

遞迴就是將大問題劃分為若干個子問題,各個問題是巢狀關係,最小的那個問題的結果是已知的,大問題不斷分解直到達到最小問題的過程叫做 遞 小問題的解釋已知的,然後根據這個解回過去求大問題的解的過程叫做 歸 最簡單的遞迴的例子就是求n的階乘 其遞推公式為 f n n f n 1 其中,f 1 1 遞迴需要滿...

斐波那契數列遞迴與非遞迴精講

斐波那契數列是學習演算法的入門級演算法,要對演算法進行研究的話我們就必須的掌握斐波那契數列演算法。以下從斐波那契數列的簡介,遞迴演算法和非遞迴演算法給大家進行介紹。簡介 遞迴演算法 什麼是遞迴演算法?我將遞迴演算法理解為乙個函式的重複呼叫。f n f n 1 f n 2 那麼重複呼叫的函式就是f x...