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

 

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