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