network flow 最大流

好久沒寫了,最近研究了一下,最大流算法。其實主要的思路,是尋找增廣路徑,找不到起點到匯點時就沒有了。下面寫下代碼

好了。

最大流算法能解決的問題,

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 );

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章