之前簡單介紹了最大流之ford-fulkerson演算法,此演算法時間複雜度為o(f*e)。大多數情況下,這個演算法已經足夠高效了,但當頂點數或最大流流量非常大時,這個演算法就顯得不夠快了。下面簡單介紹易實現的dinic演算法。
ford_fulkerson演算法通過深度優先搜尋尋找增廣路,並沿著它增廣。與之相對,dinic演算法總是尋找最短的增廣路,並沿著它增廣。時間複雜度o(e*v^2),不過。該演算法在實際應用中速度非常快,很多時候即便圖的規模比較大也沒有問題。
**:
//用於表示邊的結構體(終點,容量,反向邊)
struct edge
;
vectorg[max_v];//圖的鄰接表表示
int level[max_v];//頂點到源點的距離標號
//向圖中增加一條從s到t容量為cap的邊
void add_edge(int from,int to,long long cap)
);
g[to].push_back((edge));
}
bool bfs(int s, int t)
for(int i=0;i0&&level[e.to]<0)}}
return false;
}//通過dfs尋找增廣路
long long dfs(int v,int t,long long f)
} }
return 0;
}
//求解從s到t的最大流
long long max_flow(int s,int t)
return flow;
}
最大流 Dinic演算法
ford fulkerson演算法是通過深度優先搜尋尋找增廣路,並沿著它增廣。與之相對,dinic演算法總是尋找最短的增廣路,並沿著它增廣。因為最短增廣路的長度在增廣過程中始終不會變短,所以無需每次都通過寬度預先搜尋來尋找最短增廣路。我們可以先進行一次寬度優先搜尋,然後考慮由進距離頂點指向遠距離頂點...
網路流 最大流之Dinic演算法
網路流主要解決三種問題 最大流 最小流和費用流。最大流演算法主要有三種 ek演算法 dinic演算法 sap演算法。本篇部落格是關於dinic演算法的。最壞的情況下,dinic演算法將達到複雜度o v e2 o v2e 1 include 2 include 3 include 4 include ...
Dinic演算法求最大流
include using namespace std const int oo 1e9 無窮大 const int maxm 111111 邊的最大數量,為原圖的兩倍 const int maxn 999 點的最大數量 int node,src,dest,edge node節點數,src源點,de...