最小费用流模板

原创 2016年05月30日 18:02:58

想看更多模板?请点击:http://blog.csdn.net/martinue/article/category/6268283

和最大流模板对比着看:最大流模板(Dinic)

贴上最小费用流模板:

const   int oo=1e9;
const   int mm=11111111;
const   int mn=888888;
int node,src,dest,edge;
int ver[mm],flow[mm],cost[mm],nex[mm];
int head[mn],dis[mn],p[mn],q[mn],vis[mn];
/**这些变量基本与最大流相同,增加了
 cost 表示边的费用,
 p 记录可行流上节点对应的反向边
 */
void prepare(int _node,int _src,int _dest)
{
    node=_node,src=_src,dest=_dest;
    for(int i=0; i<node; i++)head[i]=-1,vis[i]=0;
    edge=0;
}
void addedge(int u,int v,int f,int c)
{
    ver[edge]=v,flow[edge]=f,cost[edge]=c,nex[edge]=head[u],head[u]=edge++;
    ver[edge]=u,flow[edge]=0,cost[edge]=-c,nex[edge]=head[v],head[v]=edge++;
}
/**以上同最大流*/
/**spfa 求最短路,并用 p 记录最短路上的边*/
bool spfa()
{
    int i,u,v,l,r=0,tmp;
    for(i=0; i<node; ++i)dis[i]=oo;
    dis[q[r++]=src]=0;
    p[src]=p[dest]=-1;
    for(l=0; l!=r; (++l>=mn)?l=0:l)
        for(i=head[u=q[l]],vis[u]=0; i>=0; i=nex[i])
            if(flow[i]&&dis[v=ver[i]]>(tmp=dis[u]+cost[i]))
            {
                dis[v]=tmp;
                p[v]=i^1;
                if(vis[v]) continue;
                vis[q[r++]=v]=1;
                if(r>=mn)r=0;
            }
    return p[dest]>-1;
}
/**源点到汇点的一条最短路即可行流,不断的找这样的可行流*/
int SpfaFlow()
{
    int i,ret=0,delta;
    while(spfa())
    {
        for(i=p[dest],delta=oo; i>=0; i=p[ver[i]])
            if(flow[i^1]<delta)delta=flow[i^1];
        for(i=p[dest]; i>=0; i=p[ver[i]])
            flow[i]+=delta,flow[i^1]-=delta;
        ret+=delta*dis[dest];
    }
    return ret;
}


版权声明:本文为博主原创文章,若转载请注明转载地址http://blog.csdn.net/martinue。

最小费用最大流详解与模板

最小费用最大流: 在最大流有多组解时,给每条边在附上一个单位费用的量,问在满足最大流时的最小费用是多少?思想: 给出一个容量网络,那他的最大流一定是一个定值(即使是有多个一样的最大值)。所以我们从...
  • STILLxjy
  • STILLxjy
  • 2016年07月27日 16:54
  • 13272

最小费用最大流 【模板】

如果理解了最大流连续增广路算法的思维, 理解这个算法还是很简单的。 结构体存储信息: 分别为边的起点、终点、容量、当前流量、费用、下一条边的编号。 struct Edge { int fr...

poj 2135 Farm Tour (最小费用最大流模板)

Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11372   Accepted: 4218 ...

最小费用流---ZKW算法

网络流的一些基本概念 很多同学建立过网络流模型做题目, 也学过了各种算法, 但是对于基本的概念反而说不清楚. 虽然不同的模型在具体叫法上可能不相同, 但是不同叫法对应的思想是一致的. 下面的讨论力求...

使用dijkstra求解最小费用最大流网络

前言在介绍如何使用dijkstra算法求解最小费用最大流问题的时候,假设看这篇博文的读者已经知道什么是最小费用最大流问题及熟悉dijkstra单源最短路径算法。在这篇博文里面,我并不会过多强调网络拓扑...

HDU 1853 Cyclic Tour(最小费用流)

HDU 1853 Cyclic Tour(最小费用流) http://acm.hdu.edu.cn/showproblem.php?pid=1853 题意:        给你一个N个点M条边的带权有...

最小费用最大流算法

/*************************************************** 算法引入: 任何容量网络的最大流流量是唯一且确定的,但是它的最大流f并不是唯一的; 既然最大流...
  • Jarily
  • Jarily
  • 2013年02月26日 12:56
  • 26227

最大流,kuangbin的最牛逼的模板

const int MAXN=20010;//点数的最大值 const int MAXM=880010;//边数的最大值 const int INF=0x3f3f3f3f; struct Node ...
  • cbcbcbz
  • cbcbcbz
  • 2017年08月14日 14:53
  • 217

最小割模板

其实最小割就是把一个图分为两部分的最小花费 然后,因为时间复杂度是o(n^3) 所以用邻接表存就好了 #include #include #include using namespace ...
  • cbcbcbz
  • cbcbcbz
  • 2017年08月14日 16:05
  • 56

最小费用最大流(讲解+模板)

         问题引入:最小费用最大流问题是经济学和管理学中的一类典型问题。在一个网络中每段路径都有“容量”和“费用”两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择路径、...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最小费用流模板
举报原因:
原因补充:

(最多只允许输入30个字)