先推薦乙個講網路流的部落格,我的網路流知識均吸收於此 傳送門
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...