ek演算法為最短增廣路演算法,具體步驟:
1)初始化網路中所有邊的容量 c < u , v > 為該邊的容量,同時反向邊 c < v , u > 為0,初始化最大流為0。
2)在殘留網路中找一條從源s到匯t的增廣路p。如果能找到,轉步驟(3);如果不能找到,則轉步驟(5)。
3)在增廣路p中找到所謂的「瓶頸」邊,即路徑中的最小邊,記錄下這個值x,並且累加進最大流。
4)將增廣路中所有的 c < u ,v > 減去x,所有 c < v , u > 加上x,構成新的殘留網路。轉步驟(2)。
5)得到網路的最大流,退出。
在點數較少時比較有利
時間複雜度:o(n*m^2)
空間複雜度:o(n^2)
ek演算法**:
#includeusing namespace std;const int maxn=110; ///最大點個數
const int inf=0x7fffffff;
int mp[maxn][maxn],n,p[maxn];
bool vis[maxn];
///mp:鄰接矩陣
///p:點的前驅
///vis:找增廣路時用於避免增廣點的重複選取
bool ek_bfs(int st,int ed) }}
return false; ///找不到增廣路
}int ek_max_flow(int st,int ed)
max_flow+=minn; ///累加進最大流
u=ed;
while(p[u]!=-1)
}return max_flow;
}int main()
cout
}///時間複雜度:o(n*m^2)
///空間複雜度:o(n^2)
網路流 最大流(Edmond Karp演算法)
一 含義 從源點到經過的所有路徑的最終到達匯點的所有流量和 例如 在這個圖中求源點1,到匯點4的最大流。答案為50,其中1 2 4為20 1 4為20 1 2 3 4為10 總和為20 20 10 50。二 ek演算法的核心 反覆尋找源點s到匯點t之間的增廣路徑,若有,找出增廣路徑上每一段 容量 流...
hdu4292Food(最大流Dinic演算法)
題意 每乙個人都有喜歡的吃的和喝的,每乙個人只選擇乙個數量的吃的和乙個數量的喝的,問能滿足最多的人數!思路 建圖很是重要!f food,p people,d drink 建圖 0 源點 f p p d t 匯點 將人拆分很是重要,因為每乙個人最多只能有一種選擇,也就是p p 的最大流量是 1!如果還...
hdu4292Food(最大流Dinic演算法)
題意 每乙個人都有喜歡的吃的和喝的,每乙個人只選擇乙個數量的吃的和乙個數量的喝的,問能滿足最多的人數!思路 建圖很是重要!f food,p people,d drink 建圖 0 源點 f p p d t 匯點 將人拆分很是重要,因為每乙個人最多只能有一種選擇,也就是p p 的最大流量是 1!如果還...