網路流學習筆記 最大流問題的四種演算法

2022-06-03 08:18:10 字數 2034 閱讀 2456

最大流問題滿足以下三個條件:

原圖中不存在的邊也假設存在,視為容量為0.

殘量網路:計算出每條邊上容量\(c\)與流量\(f\)之差後所得到的圖。由於上述的原因,邊數可能是原圖的兩倍。對於原圖中一條\(c=16,f=11\)的單向邊,在殘量網路中對應邊權為\(5(16-11)\)與\(11(0-(-11))\)的兩條邊。

當且僅當殘量網路中不存在\(s→t\)的有向道路(增廣路)時,此時的流是從\(s\)到\(t\)的最大流。

核心流程

優化方法

(鏈式前向星+重邊處理)

int n, m, s, t;

int num = 1;//讓邊的編號從2開始

int head[maxn], pre[maxn];

ll flow = 0;

ll d[maxn];

int flag[300][300];

//記錄重邊,重邊的容量累加到一條邊上

struct edge e[maxn*4];

void addedge(int from,int to,ll cap)

void update()

flow += d[t];

}void ek(int s, int t)

}if (d[t]) break;

//已經訪問過t,可以跳出了

}if (!d[t]) break;

//整張圖找遍依然到達不了t,說明已經沒有增廣路了

update();

}}int main()

else e[flag[u][v]].cap += w;

//如果是重邊,容量加到已存在的那條邊上

}ek(s,t);

cout << flow;

return 0;

}

ek演算法中,每一次bfs都只能找到一條增廣路,效率不高。而dinic演算法則能通過bfs同時找到多條最短增廣路,再通過dfs對找出的所有最短增廣路同時增廣。

核心流程

一次dfs最終得到的值,即以\(s\)為起點的多條最短增廣路的總流量\(nowflow\),用它更新答案\(maxflow\)。

重複以上所有步驟,直到bfs找不到增廣路。

優化方法

typedef long long ll;

const long long inf = 2005020600;

const int maxn = 5e4 + 100;

int n, m, s, t;

int num = 1;//讓邊的編號從2開始

int head[maxn];

bool vis[maxn];

ll d[maxn], maxflow;

int cur[maxn];

int flag[300][300];

int cnt[maxn];

//記錄重邊,重邊的容量累加到一條邊上

struct edge e[maxn*4];

void addedge(int from,int to,ll cap)

bool bfs() }}

return false;

}//bfs將整張圖跑一遍,將所有點分層,這樣就可以一次性找出s->t的所有最短增廣路

//最短指經過最少的節點

//dfs 從s開始遞迴搜尋殘量網路,且遞迴路線是層級逐漸加深的,這樣就能保證走的是最短路

//並且在遞迴過程中維護通路上的最小殘量

ll dfs(int now, ll minflow)

}return nowflow;

}void dinic()

}int main()

dinic();

cout << maxflow;

return 0;

}

注意:通常\(cap\)和\(flow\)這兩個屬性可以簡化為乙個屬性\(val\),意為邊\(i\)的殘量

這樣做的話,在增廣處理時,\(正向邊.val-流量\),\(反向邊.val+流量\)

學習筆記 網路流最大流

使得整個網路的流量最大的流函式叫做最大流。舉個栗子,如圖 太醜了太醜了 邊權表示容量。我們可以觀察到 如果拆開了來看,4 5 3 7這條增廣路最大流量是3,超過了相當於水管就爆了。2 5 3 7這條增廣路最大流量是2,2 10這條增廣路最大流量是2,如果合併起來看的話,發現4 5 3 7如果走了的話...

網路流 最大流問題

簡單來說,就是在有向網路圖中,單位時間內,從開始點到結束點能通過的最大流量 許多應用都包含了流量問題,例如,公路系統中有車輛流,控制系統中有資訊流,供水系統中有水流,金融系統中有現金流等等 1 源點 出發點。2 匯點 結束點。3 流 就是一條可以從源點到匯點的一條合法路徑。4 容量 每條邊都有乙個容...

網路流 最大流學習

ek演算法模板很好 最大流講解很好 一 什麼是網路流?什麼是最大流 最大流就是解決從源點到匯點的最大流量問題。二 網路流中的定義 術語 有相同g 中 滿足上述條件的圖g稱為網路流圖。記為g v,e,c 流量 流量是一條弧的實際流過的水量 通常用f u,v 表示 流量 一定不大於該弧的容量 f u,v...