Dinic演算法解決最大流問題poj1273

2021-07-08 22:34:58 字數 1048 閱讀 8192

poj1273 經典的網路流例子

這裡結網路流使用的是dinic 演算法

相比於edmondskarp演算法

每次bfs一次才可以找到一條增廣路徑的效率太低了

dinic演算法 先使用bfs對圖進行分層

分完層後 不斷的進行dfs 搜尋增廣路徑

直到圖中不可以dfs的棧為空後 再進行重新分分層

然後再不斷的進行dfs搜尋增廣路徑

直到bfs不能再到達匯點 返回最大流

include #include 

using

namespace

std;

const

int inf = 0xfffffff;

const

int maxsize = 201;

int g[maxsize][maxsize];

int layer[maxsize];//儲存bfs的層次資訊

int visit[maxsize];//在dfs中儲存訪問資訊 用來回溯

int n, m;//n為邊的個數 m為點的個數

bool bfs()}}

return

false;//從源點的bfs沒有找到匯點

}int dinic()

}sum += min;//增加總的流量

for (int i = 1; i < q.size(); i++)//更新網路

for (int a = q.back(); (!q.empty()) && (a != mins); q.pop_back())//回溯到增量的起點 尋找下條增廣路徑

visit[a] = 0;

}else

//沒有找到匯點

}if (i > m)//根據當前的dfs沒有找到匯點 且訪問完了所有節點 則回溯

q.pop_back();}}

}return sum;

}int main()

cout

<< dinic() << endl;

}return

0;}

最大流 Dinic演算法

ford fulkerson演算法是通過深度優先搜尋尋找增廣路,並沿著它增廣。與之相對,dinic演算法總是尋找最短的增廣路,並沿著它增廣。因為最短增廣路的長度在增廣過程中始終不會變短,所以無需每次都通過寬度預先搜尋來尋找最短增廣路。我們可以先進行一次寬度優先搜尋,然後考慮由進距離頂點指向遠距離頂點...

Dinic演算法解最大流問題

具體的最大流的定義及原理可以參見這位朋友的部落格 簡單易懂 最大流問題詳解 侵刪 dinic演算法的基本原理 利用bfs對圖進行分層處理,接著使用dfs從s開始,每次層次加一尋找下乙個點,直至達到匯點t,然後再回溯回去,以此遍歷所有的增廣路徑,這樣就可以滿足我們同時求出多條增廣路的需求,效率更高 因...

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...