網路最大流的演算法共有兩大類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演算法 最小生...