图论:费用流-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 ...
随机推荐
- python中的os,shutil模块的定义以及用法
# os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux/Uni ...
- Jexus支持HTTPS协议
众所周知,在HTTPS页面请求HTTP资料的时候,现代浏览器会拦截,提示用户是否继续,或者直接拦截,提示都不出来. 最近给自己做了个快速书签工具,点击书签就直接把书签发送到服务器地址,然后保存到我的网 ...
- Memcached Hash算法
本文来自网易云社区 作者:吕宗胜 Hash算法 1. Memcached Hash介绍 我们在前面的文章中已经介绍过了Memcached的内存管理方式,LRU的策略.由于Memcached的数据存储方 ...
- Question | 关于Android安全的一二事
本文来自网易云社区 "Question"为网易云易盾的问答栏目,将会解答和呈现安全领域大家常见的问题和困惑.如果你有什么疑惑,也欢迎通过邮件(zhangyong02@corp.ne ...
- php 使用GD库压缩图片,添加文字图片水印
先上一个工具类,提供了压缩,添加文字.图片水印等方法: image.class.php <?php class Image { private $info; private $image; pu ...
- JVM 什么时候会触发FGC
1:System.gc(); 2:老年代满了 没啥好说的从年轻代去往老年代的 3:JDK7或JDK6中永久区满了 得看是否还会有分配,如果没有就不会进行FGC,不过CMS GC下会看到不停地CMS G ...
- Laxcus大数据分布计算演示实例
Laxcus大数据管理系统提供了基于Diffuse/Converge分布算法的计算能力.算法的具体介绍详见<Laxcus:大数据处理系统>一文.本图展示了在集群环境下的随机数产生.排序.显 ...
- c#执行插入sql 时,报错:异常信息:超时时间已到。在操作完成之前超时时间已过或服务器未响应
问题:c#执行插入sql 时,报错:异常信息:超时时间已到.在操作完成之前超时时间已过或服务器未响应 解决: SqlCommand cmd = new SqlCommand(); cmd.Comman ...
- 小程序开发时PC端调试返回结果和手机端IOS不一致问题
IOS11登录时遇到一个请求与PC返回不一致情况, 在小程序调试时IOS上始终没有wx.request() 不能发送请求 尝试解决方法 打开微信小程序调试的设置, 将TLS设为可信任的域名 设置 -- ...
- BZOJ 4184 shallot 线性基+分治
Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从 ...