图论:费用流-SPFA+EK
利用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的更多相关文章
- BZOJ.1927.[SDOI2010]星际竞速(无源汇上下界费用流SPFA /最小路径覆盖)
题目链接 上下界费用流: /* 每个点i恰好(最少+最多)经过一次->拆点(最多)+限制流量下界(i,i',[1,1],0)(最少) 然后无源汇可行流 不需要源汇. 注: SS只会连i',求SS ...
- BZOJ.1061.[NOI2008]志愿者招募(线性规划 对偶原理 单纯形 / 费用流SPFA)
题目链接 线性规划 用\(A_{ij}=0/1\)表示第\(i\)天\(j\)类志愿者能否被招募,\(x_i\)为\(i\)类志愿者招募了多少人,\(need_i\)表示第\(i\)天需要多少人,\( ...
- BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)
BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...
- BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)
BZOJ 洛谷 \(Solution\) 很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数. 那么就用两倍的.如果\(i\)可以向\(j'\)连边,\(j\ ...
- 【bzoj4514】: [Sdoi2016]数字配对 图论-费用流
[bzoj4514]: [Sdoi2016]数字配对 好像正常的做法是建二分图? 我的是拆点然后 S->i cap=b[i] cost=0 i'->T cap=b[i] cost=0 然后 ...
- 费用流+SPFA ||Luogu P3381【模板】最小费用最大流
题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...
- 费用流+SPFA ||【模板】最小费用最大流
题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...
- 洛谷.1251.餐巾计划问题(费用流SPFA)
题目链接 /* 每一天的餐巾需求相当于必须遍历某些点若干次 设q[i]为Dayi需求量 (x,y)表示边x容y费 将每个点i拆成i,i',由i'->T连(q[i],0)的边,表示求最大流的话一定 ...
- BZOJ.2879.[NOI2012]美食节(费用流SPFA)
题目链接 /* 同"修车":对于每个厨师拆成p个点表示p个时间点,每个人向m个厨师每个时间点连边 这样边数O(nmp)+网络流 ≈O(nm*p^2)(假设SPFA线性) = GG ...
随机推荐
- Linux的系统安全设置Shell脚本
#!/bin/sh # desc: setup linux system security # powered by www.lvtao.net #account setup passwd -l xf ...
- jmeter添加自定义扩展函数之图片base64编码
打开eclipse,新建maven工程,在pom中引入jmeter核心jar包: <!-- https://mvnrepository.com/artifact/org.apache.jmete ...
- Flask Web开发从入门到放弃(一)
第1章 章节一 01 内容概要 02 内容回顾 03 路飞学城之加入购物车 04 路飞学城之结算 05 路飞学城之立即支付 06 路飞学城之后续计划 07 Flask框架简介和快速使用 08 FLas ...
- SQL 语句中 exists和not exists的用法
exists (sql 返回结果集,为真) not exists (sql 不返回结果集,为真) 如下: 表A ID NAME ...
- cocos2d-x 精灵
Sprite有两个父类:BatchableNode批量创建精灵(大量重复的比如子弹)和pyglet.sprite.Sprite. 精灵的创建
- xshell连接不到虚拟机,安装ssh服务
刚安装的虚拟机镜像是Ubuntu 16.04版本,防火墙已经关闭. 测试: 检查虚拟机分配的ip地址. 1.虚拟机ping宿主机:可以ping通 2.宿主机ping虚拟机:可以ping通 3.检查网络 ...
- PHP Warning: File upload error - unable to create a temporary file in Unknown on line 0
代码在本地运行一切都OK,放到服务器上,网站访问正常,上传就出现该错误. 提示:PHP Warning: File upload error - unable to create a temporar ...
- HDU 4744 Starloop System(最小费用最大流)(2013 ACM/ICPC Asia Regional Hangzhou Online)
Description At the end of the 200013 th year of the Galaxy era, the war between Carbon-based lives a ...
- Java项目启动时候报Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 解决办法
今天在发布Java项目的时候又遇到 Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At leas ...
- 并查集——poj2492(带权并查集入门)
一.题目回顾 题目链接:传送门 题意:给定n只虫子,不同性别的可以在一起,相同性别的不能在一起.给你m对虫子,判断中间有没有同性别在一起的. 二.解题思路 种类并查集 和poj1073的本质一样 详见 ...