利用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. MVC5使用单选按钮与下拉框【转】

    某人认为下拉列表的呈现形式不如单选按钮漂亮,我只好去测试一下单选按钮与下拉框了.测试代码如下: 1.model类Blog.cs(类型使用枚举类型,自动生成的视图会以下拉列表形式显示): using S ...

  2. Linux安装mysql以及安装时踩下的坑

    安装: 检测是否已经安装了mysql rpm -qa | grep mysql 如果已经安装了,将其卸载,如: rpm -e --nodeps  mysql-libs-5.1.71-1.el6.x86 ...

  3. SharedPreferences Android

    类似iOS的NSUserDefaults,采用key-value(键值对)形式,主要用于轻量级的数据存储 public class MainActivity extends AppCompatActi ...

  4. Django笔记 —— 高级视图和URL配置

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  5. win10子系统Ubuntu18.04下安装图形界面

    前提:windows 10 已经安装WSL(windows subsystem for linux),并能正确运行Bash. 要想使用Linux的图形用户界面通常有两种方法,一种是使用X-Window ...

  6. 【Selenium-Python】Selenium-Firefox 环境配置 win64

    Python 已安装完毕 Selenium 安装: Windows > cmd pip install selenium 注:未加selenium版本号时默认安装最新版本. 查询当前Seleni ...

  7. CodeForces - 948C(前缀和 + 二分)

    链接:CodeForces - 948C 题意:N天,每天生产一堆雪体积 V[i] ,每天每堆雪融化 T[i],问每天融化了多少雪. 题解:对 T 求前缀和,求每一堆雪能熬过多少天,再记录一下多余的就 ...

  8. LeetCode 81——搜索旋转排序数组 II

    1. 题目 2. 解答 2.1. 方法一 基于 LeetCode 33--搜索旋转排序数组 中的方法二. 当 nums[mid] = nums[right] 时,比如 [1, 1, 2, 1, 1], ...

  9. 稳定匹配 - Stable Matching

    这篇文章将会对稳定匹配算法进行介绍及Python代码的实现,第一部分会针对稳定匹配的Gale-Shapley算法进行解析,第二部分就是用Python对该算法进行实现. 一.稳定匹配算法原理 1.1 介 ...

  10. 团队项目-第十次scrum 会议

    时间:11.6 时长:20分钟 地点:主235教室走廊 工作情况 团队成员 已完成任务 待完成任务 解小锐 完成多种招聘方式的逻辑编写 陈鑫 实现游戏的存档功能 李金奇 添加多种招聘方式等功能 王辰昱 ...