先看看遞迴的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...