图论:费用流-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 ...
随机推荐
- allegro导入网表过程中出现的错误信息
1. 找不到焊盘PAD,下面这句话的意思是器件封装找不到焊盘46.pad WARNING(SPMHNI-): Unable to load symbol ): Could not find padst ...
- Oracle 完全理解connect by-详细脚本-可实战
狒狒Q971751392 未来星开发团队--狒狒(QQ:9715234) oracle树查询的最重要的就是select…start with…connect by…prior语法了.依托于该语法,我们 ...
- Java Web前后端分离的思考与实践
第一节 Java Web开发方式的变化 Web开发虽然是我们常说的B/S模式,其实本质上也是一种特殊的C/S模式,只不过C和S的选择余地相对要窄了不少,而且更标准化.不论是采用什么浏览器和后端框架,W ...
- TortoiseHg 学习笔记一
因项目需要频繁的提交.合并代码,前段时间别人在我笔记本上装了个TortoiseHg,我不怎么会用 现在学习一下,目前没时间写太多东西,未完待续 记录一下查看的文章 http://jingyan.bai ...
- ACE_Select_Reactor_T 介绍 (2)
本章目录 ACE_Select_Reactor_T 介绍 类继承图 类协作图 类主要成员变量 事件处理函数调用图 事件处理主流程 handle_events 函数流程 handle_events_i ...
- 当我们在安装tensorflow时,我们在安装什么?- Intro to TF, Virtualenv, Docker, CUDA, cuDNN, NCCL, Bazel
(Mainly quoted from its official website) Summary: 1. TensorFlow™ is an open source software library ...
- Browser-Solidity的本地安装及使用介绍
Browser-Solidity的本地安装及使用介绍 正所谓工欲善其事必先利其器,巧妇也难为无米之炊,所以在学习智能合约之前,必须要先把工具准备好.Browser-Solidity 是 Ethereu ...
- penLDAP学习笔记
LDAP协议 目录是一组具有类似属性.以一定逻辑和层次组合的信息.常见的例子是通讯簿,由以字母顺序排列的名字.地址和电话号码组成.目录服务是一种在分布式环境中发现目标的方法.目录具有两个主要组成部分: ...
- STL中的set容器的一点总结2
http://blog.csdn.net/sunshinewave/article/details/8068326 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像 ...
- [剑指Offer] 30.连续子数组的最大和
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...