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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值