好久沒寫了,最近研究了一下,最大流算法。其實主要的思路,是尋找增廣路徑,找不到起點到匯點時就沒有了。下面寫下代碼
好了。
最大流算法能解決的問題,
1. 顧明思義,即一組網絡上能夠容納的最大流量問題
2. 可以解決數學的組合問題。其原理上還是一個規劃問題
下面的代碼是,通過bfs找到一條增廣路徑。
int find_path_bfs(int s, int e){
int visited[vertex_number];
memset(visited , 0 , sizeof(visited));
memset(pre , -1 , sizeof(pre));
visited[s] = 1;
queue<int > q ;
q.push(s);
int minx = INF;
while(!q.empty()){
int cur = q.front();
q.pop();
for(int i = 1 ; i <= vertex_number ; i++ ){
if(edges[cur][i] != 0 && visited[i] == 0){
q.push(i);
minx = edges[cur][i] < minx ? edges[cur][i] : minx ;
pre[i] = cur;
visited[i] = 1;
}
}
}
if(pre[e] == -1) return 0;
return minx;
}
以下是更新殘留網絡,更新方向邊
void update_graph(int e , int once){
while(pre[e] != -1){
edges[pre[e]][e] -= once ;
edges[e][pre[e]] += once ;
e = pre[e];
}
}
最後 遞歸就行了。
do{
netflow = find_path_bfs(s,e );
update_graph(e, netflow);
res += netflow ;
}while(netflow != 0 );