最大流五大演算法簡述

2022-07-13 03:45:07 字數 2412 閱讀 7499

網路最大流的演算法共有兩大類5種演算法 總體如下表:n為頂點數,m為弧的數目,u代表各條弧的最大容量

演算法名稱

複雜度演算法概要

一般增廣路演算法

\(o(nmu)\)

採取標號法每次在容量網路中尋找一條增廣路進行增廣(或在殘留網路中每次任意尋找一條增廣路進行增廣),直至不存在增廣路為止。

最短增廣路演算法

\(o(nm^2)\)

每個階段:在層次網路中,不斷用bfs演算法進行增廣直至不存在增廣路為止。如果匯點不在層次網路中,演算法結束。

連續最短增廣路演算法(dinic)

\(o(n^2m)\)

在最短增廣路演算法的基礎上改造:在每個階段,用乙個dfs過程實現多次增廣。如果匯點不在層次網路中,則演算法結束。

一般預流推進演算法

\(o (n^2m)\)

維護乙個預流,不斷地對活躍頂點執行推進(push)操作或重標號(relabel)操作來調整這個預流,直到不能操作。

最高標號預流推進演算法

\(o( n^2\sqrt m)\)

每次檢查具有最高標號的活躍結點

\(f(u,v) = f(u,v) + a\ when\in p+\)

\(f(u,v) = f(u,v)+a\ when \in p-\)

$ f(u,v) = f(u,v) \ when \notin p$

通過bfs來進行多次增廣路的優化 **如下:

#includeusing namespace std;

#define maxn 1000

#define inf 1000000//根據題目條件改變

struct arctype ;

arctype edge[maxn][maxn];

int n,m;

int flag[maxn];//頂點狀態:-1未標號 0已標號未檢查 1已標號以檢查

int pre[maxn];//標號的第乙個分量:指明從哪個點得到,以便找出可改進量和增廣路徑

int alpha[maxn];//標號的第二個分量:可改進量a

queueq;

int v;

void ford()

else if(edge[i][v].c < inf && edge[i][v].f > 0) }}

flag[v] = 1;

}if(flag[n-1] == -1 || alpha[n-1] == 0) break;//當匯點無需調整,退出迴圈

int k1 = n-1,k2 = abs(pre[k1]);

int a = alpha[n-1];

while(1)

}int maxflow = 0;

for(int i = 0;i < n;i++)

}printf("maxflow:%d\n",maxflow);

} int main()

for(int i = 0;i < m;i++)

ford();

return 0;

}

複雜度簡要分析:

​ 很明顯,如果容量網路中各弧的容量和初始流量均為正整數,則ford-fulkerson演算法每增廣一次,流量至少會增加乙個單位,因此ford-fulkerson演算法肯定能在有限的步驟內使得網路流達到最大。類似的理由可以說明如果弧上的容量為有理數時,也可在有限的步驟內使得網路流達到最大。但是如果弧上的容量可以是無理數,則該演算法不一定在有限步內終止。

​ 由於割$ , v-$ 中前向弧的條數最多為n條,因此最大流流量|f|的上界為nu(u表示網路中各個弧的最大容量)。此外,由於每次增廣最多需要對所有弧檢查一遍,所以ford-fulkerson演算法的時間複雜度為$ o(mnu)$ 。

例題:poj1149

預流:設\(f = \\) 是容量網路的乙個網路流,如果g的每一條邊弧都滿足: \(0\leq f(u,v) \leq c(u,v)\)

另外,除源點匯點以外每個頂點u的盈餘e(u)都滿足:\(e(u) \geq 0\) 則稱該網路流是g的預流。

​ 預流推進通過不斷的對活躍節點的改進來達到最大流

模板如下:

using namespace std;

const int maxn = 110;

const int maxf = 0x7fffffff;

int n,np,nc,m;

int resi[maxn][maxn];

dequeact;

int h[maxn];

int ef[maxn];

int s,t,v;

void push_relabel()

}if(u != s && u != t && ef[u] > 0)

} printf("%d\n",sum);

}

五大框架面試簡述

五大框架 springmvc,struts2,spring,mybatis,hibernate 說說你對springmvc框架的理解?簡要口述 如果感覺說的少可以在完整答案裡面挑幾條說 springmvc就是spring框架的乙個模組,它是乙個基於mvc設計思想的前端web層框架,主要作用就是對前端...

簡述WordPress的五大優點

剛開了個wordpress分類,打算做個wordpress教程,分享點wordpress優化經驗。wordpress是世界上應用最廣泛的部落格程式,同時也可以作為cms來使用,程式設計客棧國內外不乏wordpress優化企業站 門戶站。wordpress也是我最鍾愛的 程式,選擇wordpress的...

五大常用演算法

主要是演算法演算法的複雜度 1.分治法 話說遞迴與hanoi塔 二分法求方程近似解 用c 實現合併排序 求最大值和最小值的分治演算法 2.動態規劃法 動態規劃求0 1揹包問題 最長公共子串問題的實現 用動態規劃實現飛彈攔截 最大化投資回報問題的實現 3.貪心演算法 最小生成樹之prim演算法 最小生...