最大流模板(SAP演算法)(鄰接表形式)

2021-09-06 06:17:48 字數 1179 閱讀 1436

最大流的sap模板,用了很多次了。今天總結貼下(雖然**不夠精簡,但是自己寫的也總算看起來明白些,不容易錯)

據說沒有可以卡sap的最大流。。。

const

int maxn=20010;//

點數的最大值

const

int maxm=880010;//

邊數的最大值

const

int inf=0x3f3f3f3f

;struct

node

edge[maxm];

inttol;

inthead[maxn];

intdep[maxn];

int gap[maxn];//

gap[x]=y :說明殘留網路中dep[i]==x的個數為y

int n;//

n是總的點的個數,包括源點和匯點

void

init()

void addedge(int u,int v,int

w)void bfs(int start,int

end)

}}int sap(int start,int

end)

for(i=0;i)

res+=temp;

top=inser;

u=edge[s[top]].from

; }

if(u!=end&&gap[dep[u]-1]==0)//

出現斷層,無增廣路

break

;

for(i=cur[u];i!=-1;i=edge[i].next)

if(edge[i].cap!=0&&dep[u]==dep[edge[i].to]+1

)

break

;

if(i!=-1

)

else

}--gap[dep[u]];

dep[u]=min+1

; ++gap[dep[u]];

if(u!=start)u=edge[s[--top]].from

; }

}return

res;

}

最大流SAP 鄰接表模板

const int maxn 1010 點數的最大值 const int maxm 400010 邊數的最大值 const int inf 0x3f3f3f3f struct edge edge maxm 注意是maxm int tol int head maxn int gap maxn dep ...

最大流SAP演算法

求最大流有一種經典的演算法,就是每次找增廣路時用bfs找,保證找到的增廣路是弧數最少的,也就是所謂的edmonds karp演算法。可以證明的是在使用最短路增廣時增廣過程不超過v e次,每次bfs的時間都是o e 所以edmonds karp的時間複雜度就是o v e 2 如果能讓每次尋找增廣路時的...

最大流SAP演算法

求最大流有一種經典的演算法,就是每次找增廣路時用bfs找,保證找到的增廣路是弧數最少的,也就是所謂的edmonds karp演算法。可以證明的是在使用最短路增廣時增廣過程不超過v e次,每次bfs的時間都是o e 所以edmonds karp的時間複雜度就是o v e 2 如果能讓每次尋找增廣路時的...