網路最大流 ISAP演算法詳解與模板

2021-07-15 15:16:19 字數 1956 閱讀 1199

isap演算法

isap(improved shortest augumenting path)演算法是改進版的sap演算法,如果對效率要求很高的時候,可以用該演算法。

(1)概述:演算法基於這樣的乙個事實:每次增廣之後,任意結點到匯點(在殘餘網路中)的最短距離都不會減小。這樣,我們可以利用d[i[表示結點i到匯點的距離的下界。然後再增廣過程當中不斷地修改這個下界。增廣的時候和dinic演算法類似,只允許沿著d[i]==d[j]+1的弧(i,j)走。

不難證明,d[i[滿足兩個條件:(1)d[t]=0;(2)對任意的弧(i,j) d[i]≤d[j]+1。因為最壞的情況就是s到t是一條鏈,此時等號成立。因此,當d[s]≥n時,殘餘網路中不存在s-t路。

那麼與dinic演算法類似,事先逆向bfs,找增廣的過程就是沿著「允許弧」(即滿足f< c且d[i]==d[j]+1的弧)往前走。(稱為「前進」)。如果向前走不動了,那麼就要考慮原路返回(稱為「撤退」)。此時把d[i]修改為min+1即可。因為要滿足d函式的條件(2)。修改後,原來的i值的個數就減少乙個,而新i值的個數多乙個。在程式中,用num陣列來儲存所有距離的個數,當把距離值從x修改為y時,num[x]–,num[y]++即可,然後檢查num[x]是否為0,如果是0,那麼s-t不連通,演算法終止。原因顯而易見:比如s-t的距離是3,如果距離為2的情況都已經沒了,更別提走到距離為1的點了。這就是所謂的「gap優化」。

通過之前的分析,在資料結構方面,該演算法只比dinic演算法的資料結構多了兩個陣列:用於記錄父邊以便於撤退的陣列p,以及標記距離個數的陣列num。增廣的時候分為兩步,第一步逆推求出可改進量a(即殘餘量的最小值);第二步再逆推一遍,進行增廣。主過程中,x走到匯點時增廣。

在下面**中,由於我們是連續存的正向邊和反向邊,如0和1,2和3,等等。而他們分別與1異或後可以得到對方(二進位制最後一位變反,其他位不變),所以我們在更新反向邊時用到了這一點。

**模板:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define n 1000

#define inf 100000000

struct edge

};struct isap

int augumemt()

x=t;

while(x!=s)//增廣

return a;

}void bfs()//逆向進行bfs}}

}int maxflow(int s,int t)//根據情況前進或者後退,走到匯點時增廣

int ok=0;

for(int i=cur[x];iif(e.cap>e.flow&&d[x]==d[e.to]+1)

}if(!ok)//走不動了,撤退

if(--num[d[x]]==0)break;//如果走不動了,且這個距離值原來只有乙個,那麼s-t不連通,這就是所謂的「gap優化」

num[d[x]=m+1]++;

cur[x]=0;

if(x!=s)

x=edges[p[x]].from;//退一步,沿著父邊返回}}

return flow;

}};int main()

scanf("%d%d",&isap.s,&isap.t);

printf("%d\n",isap.maxflow(isap.s,isap.t);)

}return

0;}

模板 網路最大流ISAP

模板 網路最大流isap 建反邊從t到s,bfs跑記錄每個點所在層,gap記錄每層的點數 include using namespace std typedef long long ll const ll max n 1e6 const ll max m 1e6 const ll max e max...

網路流 最大流問題 ISAP 演算法解釋

august 7,2013 程式設計指南 isap 是圖論求最大流的演算法之一,它很好的平衡了執行時間和程式複雜度之間的關係,因此非常常用。我們使用鄰接表來表示圖,表示方法可以見文章帶權最短路 dijkstra,spfa,bellman ford,asp,floyd warshall 演算法分析或二...

網路流 最大流 ISAP 模板

至於怎麼找到的呢 我才不會說是當初搜網路流乙個個都不理解然後翻到十幾頁點進去看到的 吶 貌似是 國立台灣師範大學 的 這學校是不是這個名 繁體我不會認啊好尷尬 前言 首先不知道這是 isap 還是 sap.作為乙個剛學網路流的蒟蒻 frocean 感覺這網路流真是個玄學的東西 跟著標打模板 0分 0...