利用SPFA+EK算法解决费用流问题

例题不够裸,但是还是很有说服力的,这里以Codevs1227的方格取数2为例子来介绍费用流问题

这个题难点在建图上,我感觉以后还要把网络流建模想明白才能下手去做这种题,老实说挺难的

先直接给出建图的代码:

scanf("%d",&x);
//把每个节点拆成两个,分别为ai和bi
//ai向bi连边,费用为权值,容量为1
//再连边,费用为0,容量为k,保证联通
addedge((i-)*n+j,(i-)*n+j+n*n,,x);
addedge((i-)*n+j,(i-)*n+j+n*n,k,);
//让bi能往下面或者左面走
if(j<n)
addedge((i-)*n+j+n*n,(i-)*n+j+,k,);
if(i<n)
addedge((i-)*n+j+n*n,i*n+j,k,);

然后给出完整实现,请记住cnt初始必须是1,为了和^配套使用

否则RE???

差点儿把以后的自己坑死

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
const int maxm=;
const int INF=0x7fffffff;
int n,k,cnt=;
bool inq[maxn];
int g[maxn],dis[maxn],q[maxm],from[maxn];
long long ans;
struct Edge{int from,to,v,c,next;}e[maxm];
void addedge(int u,int v,int w,int c) //cost是费用
{
e[++cnt].from=u;e[cnt].to=v;e[cnt].v=w;e[cnt].c=c;
e[cnt].next=g[u];g[u]=cnt; e[++cnt].from=v;e[cnt].to=u;e[cnt].v=;e[cnt].c=-c;
e[cnt].next=g[v];g[v]=cnt;
}
bool spfa()
{
int t=,w=,u;
memset(dis,-,sizeof(dis));
q[]=;dis[]=;inq[]=;
while(t<w)
{
u=q[t];t++;
for(int tmp=g[u];tmp;tmp=e[tmp].next)
{
if(e[tmp].v>&&dis[u]+e[tmp].c>dis[e[tmp].to])
{
dis[e[tmp].to]=dis[u]+e[tmp].c;
from[e[tmp].to]=tmp;
if(!inq[e[tmp].to])
{q[w]=e[tmp].to;w++;inq[e[tmp].to]=;}
}
}
inq[u]=;
}
if(dis[]==-) return ;
return ;
}
void mincf()
{
int sum=INF;
int tmp=from[];
while(tmp)
{
sum=min(sum,e[tmp].v);
tmp=from[e[tmp].from];
}
tmp=from[];
while(tmp)
{
e[tmp].v-=sum;
e[tmp^].v+=sum;
ans+=sum*e[tmp].c;
tmp=from[e[tmp].from];
}
}
int main()
{
int x;
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
scanf("%d",&x);
//把每个节点拆成两个,分别为ai和bi
//ai向bi连边,费用为权值,容量为1
//再连边,费用为0,容量为k,保证联通
addedge((i-)*n+j,(i-)*n+j+n*n,,x);
addedge((i-)*n+j,(i-)*n+j+n*n,k,);
//让bi能往下面或者左面走
if(j<n)
addedge((i-)*n+j+n*n,(i-)*n+j+,k,);
if(i<n)
addedge((i-)*n+j+n*n,i*n+j,k,);
}
//源点和汇点
addedge(,,k,);
addedge(n*n*,,k,);
while(spfa()) mincf();
printf("%lld",ans);
return ;
}

还有一点就是这个题是最大费用最大流,最小费用最大流还有ZKW费用流以后再介绍

图论:费用流-SPFA+EK的更多相关文章

  1. BZOJ.1927.[SDOI2010]星际竞速(无源汇上下界费用流SPFA /最小路径覆盖)

    题目链接 上下界费用流: /* 每个点i恰好(最少+最多)经过一次->拆点(最多)+限制流量下界(i,i',[1,1],0)(最少) 然后无源汇可行流 不需要源汇. 注: SS只会连i',求SS ...

  2. BZOJ.1061.[NOI2008]志愿者招募(线性规划 对偶原理 单纯形 / 费用流SPFA)

    题目链接 线性规划 用\(A_{ij}=0/1\)表示第\(i\)天\(j\)类志愿者能否被招募,\(x_i\)为\(i\)类志愿者招募了多少人,\(need_i\)表示第\(i\)天需要多少人,\( ...

  3. BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)

    BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...

  4. BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)

    BZOJ 洛谷 \(Solution\) 很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数. 那么就用两倍的.如果\(i\)可以向\(j'\)连边,\(j\ ...

  5. 【bzoj4514】: [Sdoi2016]数字配对 图论-费用流

    [bzoj4514]: [Sdoi2016]数字配对 好像正常的做法是建二分图? 我的是拆点然后 S->i cap=b[i] cost=0 i'->T cap=b[i] cost=0 然后 ...

  6. 费用流+SPFA ||Luogu P3381【模板】最小费用最大流

    题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...

  7. 费用流+SPFA ||【模板】最小费用最大流

    题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...

  8. 洛谷.1251.餐巾计划问题(费用流SPFA)

    题目链接 /* 每一天的餐巾需求相当于必须遍历某些点若干次 设q[i]为Dayi需求量 (x,y)表示边x容y费 将每个点i拆成i,i',由i'->T连(q[i],0)的边,表示求最大流的话一定 ...

  9. BZOJ.2879.[NOI2012]美食节(费用流SPFA)

    题目链接 /* 同"修车":对于每个厨师拆成p个点表示p个时间点,每个人向m个厨师每个时间点连边 这样边数O(nmp)+网络流 ≈O(nm*p^2)(假设SPFA线性) = GG ...

随机推荐

  1. LI 标签中让文章标题左对齐,日期右对齐的方法

    希望实现标题在左对齐,日期在右对齐,当直接给日期的span加上float:right时,IE8和FF都OK,但IE6/7则会换行,下面给出一个简单有效的解决办法. <!DOCTYPE html  ...

  2. Phoenix映射HBase数据表

    1. 说明 安装好phoenix后对于HBase中已经存在的数据表不会自动进行映射,所以想要再phoenix中操作HBase已有数据表就需要手动进行配置. 2. 创建HBase表 > creat ...

  3. 通过数据库恢复SharePoint网站

           SharePoint网站一般包含很多个数据库,最主要的有3个,分别是SharePoint_Admin_Content(管理中心数据库),SharePoint_Config(配置数据库)和 ...

  4. LeetCode题目解答

    LeetCode题目解答——Easy部分 Posted on 2014 年 11 月 3 日 by 四火 [Updated on 9/22/2017] 如今回头看来,里面很多做法都不是最佳的,有的从复 ...

  5. 谷歌js编码规范解析

    http://alloyteam.github.io/JX/doc/specification/google-javascript.xm 阅读了谷歌js编码规范,我发现了很多,js的里面很多要注意的问 ...

  6. 【赛后补题】(HDU6228) Tree {2017-ACM/ICPC Shenyang Onsite}

    这条题目当时卡了我们半天,于是成功打铁--今天回来一看,mmp,贪心思想怎么这么弱智.....(怪不得场上那么多人A了 题意分析 这里是原题: Tree Time Limit: 2000/1000 M ...

  7. 《python核心编程第二版》第2章习题

    2-1 略 2-1 略 2-2 (a)打印 结果是9 (b)9 (c)一样 (d)略 (e)略 2-3 略 2-4 (a) # /usr/bin/pythonraw_input() (b) # /us ...

  8. sphinx调用API参考(官方手册)

    API的参考实现是用PHP写成的,因为(我们相信)较之其他语言,Sphinx在PHP中应用最广泛.因此这份参考文档基于PHP API的参考,而且这节中的所有的代码样例都用PHP给出. 当然,其他所有A ...

  9. lintcode-123-单词搜索

    123-单词搜索 给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词. 单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻.每个单元中的字母最多只能使用一次. ...

  10. maven打包遇到的问题

    1.javax.servlet.jsp.tagext不存在 maven打包报程序包javax.servlet.jsp.tagext不存在或者maven打包报程序包javax.servlet.jsp不存 ...