zoukankan      html  css  js  c++  java
  • 最小费用最大流问题

    一、定义与定理
          最小费用最大流:设G是以s为源t为汇的网络,c是G的容量,b是G的单位流量费用,且有b[i][j] = -b[i][j],f是G的流,则b(f)=∑(fij*bij),(i, j)∈E(G) 且fij>0。最小费用最大流问题,就是求网络G的最大流f且使费用b(f)最小。这样的流称为最小费用最大流。
    二、算法思想
          用Ford-Fulkerson算法的思想,不断地在残留网络中寻找增广路,只不过这个增广路是当前网络中s到t的以单位流量费用为权的最短路,对这条增广路进行操作。由于费用有负值,建议用SPFA算法。

    三、算法介绍
          描述:

          实现:

     1mcmf()
     2{
     3    while(true)
     4    {
     5        for(int i=1; i<=n+m+1; i++)
     6            d[i] = MAX;
     7        d[s] = 0;
     8        spfa(); //p中存有该点的前继点
     9        if(p[t] == -1//表示已无增广路
    10            break;
    11        int minf = INT_MAX;
    12        int it = t;
    13        while(p[it] != -1)
    14        {
    15            minf = min(minf, c[p[it]][it] - f[p[it]][it]);
    16            it = p[it];
    17        }

    18        it = t;
    19        while(p[it] != -1)
    20        {
    21            f[p[it]][it] += minf;
    22            f[it][p[it]] = -f[p[it]][it];
    23            it = p[it];
    24        }

    25    }

    26}


    三、算法示例
          POJ 2516 解题报告

  • 相关阅读:
    frida hook native -- frida hook so层 实例代码讲解
    frida hook 类所有方法(ZenTracker)
    frida hook AES DES RSA 自吐算法
    frida java层和c层打印堆栈 (修复优化)
    frida延时hook的3种方法
    [去广告]x米万能遥控 去掉底部banner广告
    Linux使用C语言连接MYSQL
    Linux一对一通信(UDP)
    Linux一对多的通信
    Linux一对一的通信
  • 原文地址:https://www.cnblogs.com/ACAC/p/1741175.html
Copyright © 2011-2022 走看看