最大流之Dinic演算法

2021-08-08 13:17:21 字數 850 閱讀 2912

之前簡單介紹了最大流之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...