網路流EdmondsKarp演算法模板理解

2021-08-19 17:46:17 字數 2398 閱讀 9486

先推薦乙個講網路流的部落格,我的網路流知識均吸收於此   傳送門

edmondskarp演算法基本思想:從起點到終點進行bfs,只要存在路,說明存在增廣路徑,則取這部分路 權值最小的一部分,即為增廣路徑(也就是這一部分路的最大流量)。然後將這條路上的正向權值都減去min,反向權值都加上min(即,m[i][j]-min,m[j][i]+min,為什麼等會再解釋)。然後重複此操作,最終就得到了最大流。

先上模板(也是取自於剛才的部落格,真的寫的很精簡很好懂)。

鄰接矩陣版本。

#include #include #include #include using namespace std;  

const int maxn = 300;

const int max_int = ((1 << 31) - 1);

int n; // 圖中點的數目

int pre[maxn]; // 從 s - t 中的乙個可行流中, 節點 i 的前序節點為 pre[i];

bool vis[maxn]; // 標記乙個點是否被訪問過

int mp[maxn][maxn]; // 記錄圖資訊

bool bfs(int s, int t)

} }

return false;

}

int ek(int s, int t)

for(int i = t; i != s; i = pre[i])

ans += mi;

} return ans;

}

這部分**唯一不好理解的就是,

for(int i = t; i != s; i = pre[i])
mp[pre[i]][i]-mi好理解,因為已經流過了嘛,那為什麼有mp[i][pre[i]]+=mi呢?讓我們看乙個具體的例子。

按照我們的做法,第一次得到了1-2-4-6這條路徑,會發現最大流此時是2,然後將路徑上的值全部減去2,然後得到的圖是這樣的:

如果只減掉了正向的路徑的權值,這個圖就不連通了,也就是答案是2,然而其實答案是3,為什麼呢,讓我們加上反向的權值看一下:

紅色的就是反向的權值,然後再進行上述過程,會發現還有一條 1-3-4-2-5-6的路徑,權值為1,所以答案是2+1=3.(這個答案大家可以根據第一幅圖自己想一下,會發現就是3,好神奇有木有?)

那為什麼這麼神奇呢,我的理解是,反向路徑代表了,這條路曾經通了多少水,比如2-4這條就通2滴水,然後在第二條路徑中通過的這1滴水,其實就是2號路徑跟1號路徑說,你原本在2-4這條路上有兩滴水,現在分一滴到我想去的地方,然後我的水去你想去的地方,這樣我們都能實現目標。(想一下是不是這麼回事)。

解決了這個難題,那ek演算法的模板你就理解啦!

接下來送上鄰接表的版本。

const int maxn = 430;  

const int max_int = (1 << 30);

struct edge;

struct node;

int n, m, ecnt;

bool vis[maxn];

int head[maxn];

node pre[maxn];

edge edge[maxn];

void init()

void addedge(int u, int v, int w)

bool bfs(int s, int t)

} }

return false;

}

int ek(int s, int t)

for(int i = t; i != s; i = pre[i].v)

ans += mi;

} return ans;

}

// 加邊

addedge(u, v, w);

addedge(v, u, 0);

// 呼叫

int ans = ek(s, t);

網路流最大流(Edmonds Karp )

根據定義,若一條從源點s到匯點t的路徑上各點的剩餘容量都大於0,則稱這條路徑為增廣路。那麼就可以通過不斷尋找增廣路來求出最大流。具體做法就是通過bfs尋找從s到t的增廣路徑,並順便計算出最小剩餘容量minx,找到後路徑上各點減去minx,答案 最大流 加上minx。需要注意的是,因為是單純的遍歷所有...

網路流 最大流 Edmonds Karp演算法

edmonds karp演算法,複雜度o ve 2 思想就是找增廣路,不斷增加流量。在殘量 每條邊上流量和容量的差 圖上找一條每個邊權值都為正的路 可以通過bfs,比dfs效率高 這些邊權值裡的最小值就是這條路可以增加的流量,然後在這條路徑上更新流量。再重複找這樣的路更新流量,直到找不到這樣的路了就...

Edmonds Karp演算法,網路流最大流

網路流是一種生活中常見的圖模型,包含乙個起始點,和乙個匯點,以及若干結點,用有向邊連線,每條邊的權值代表能流經該邊的最大流量。生活中,水流網路,電流網路,資訊網路這些問題都能描述成網路流。網路流中一種常見的問題是最大流問題。即求從起始點到達匯點流的最大值。在 演算法導論 介紹了edmonds kar...