[日常摸鱼]pojKaka's Matrix Travels-拆点+最大费最大流
方格取数的升级版,每个格子最多取一次。
$k=1$的话就是个普及组的dp题,$k=2$就是在之前的基础上多加两维。
然而现在$k$太大了当然就不dp啦
对于$k=1$的情况我们还可以把$(i,j)$向$(i+1,j),(i,j+1)$连边然后答案就是跑最长路,而对于更大的情况我们的瓶颈在于直接跑最长路不能限制每个点只取一次。
对于点来说没有什么好的方法我们就把问题转移到边上:把每个点拆成一条边。具体的说就是把一个点拆成两个点,把点权变成边权,而我们又要限制这样子的每条边最多走一次,这里就有点费用流的感觉了(雾)。
所以我们可以这样建图:把点$i$拆成$i$和$i'$,不妨令$i$为入点$i'$为出点,从入点到出点连两条边:一条容量为1,费用为点权$c$,另一条容量为$k-1$,费用为0。
原图里的点的出点再向能够直接到达的点的入点连一条容量为$k$,费用为0的边。
这样每次bfs的时候只要成功都会走出一条完整的路径,路径上的费用被算进去之后这条路也就不会再走了(因为有费用的只有容量为1的嘛),于是也就保证了只会取一次并且一定是第一次经过的时候被取走。
以起点的入点为源点,以终点的出点为汇点跑最大费用最大流得到的就是答案啦
#include<cstdio>
#include<queue>
#include<cstring>
#define rep(i,n) for(register int i=1;i<=n;i++)
#define REP(i,a,b) for(reigster int i=a;i<=b;i++)
using namespace std;
const int N=5005;
const int M=20005;
const int INF=(~0u>>1);
struct edge
{
int to,nxt,w,c;
edge(int to=0,int nxt=0,int w=0,int c=0):to(to),nxt(nxt),w(w),c(c){}
}edges[M<<1];
int n,k,s,t,ans,cnt;
int head[M<<1],infc[N],vis[N],d[N],pre[N];
queue<int>q; inline void addEdge(int u,int v,int w,int c)
{
edges[++cnt]=edge(v,head[u],w,c);head[u]=cnt;
edges[++cnt]=edge(u,head[v],0,-c);head[v]=cnt;
}
inline int get_num(int i,int j,int p)
{
return (i-1)*n+j+n*n*p;
}
#define cur edges[i].to
inline bool spfa()
{
memset(vis,0,sizeof vis);
rep(i,t)d[i]=-INF;q.push(s);
d[s]=0;infc[s]=INF;vis[s]=1;
while(!q.empty())
{
int x=q.front();q.pop();vis[x]=0;
for(register int i=head[x];i;i=edges[i].nxt)if(edges[i].w&&d[cur]<d[x]+edges[i].c)
{
d[cur]=d[x]+edges[i].c;
pre[cur]=i;infc[cur]=min(infc[x],edges[i].w);
if(!vis[cur])vis[cur]=1,q.push(cur);
}
}
if(d[t]==-INF)return 0;
return 1;
}
#undef cur
inline void updata()
{ int tmp=t;
while(tmp!=s)
{
int i=pre[tmp];
edges[i].w-=infc[t];
edges[i^1].w+=infc[t];
tmp=edges[i^1].to;
}
ans+=d[t];
}
int main()
{
scanf("%d%d",&n,&k);
s=1;t=2*n*n;cnt=1;
rep(i,n)rep(j,n)
{
int x;scanf("%d",&x);
addEdge(get_num(i,j,0),get_num(i,j,1),1,x);
addEdge(get_num(i,j,0),get_num(i,j,1),k-1,0);
if(i<n)addEdge(get_num(i,j,1),get_num(i+1,j,0),k,0);
if(j<n)addEdge(get_num(i,j,1),get_num(i,j+1,0),k,0);
}
while(spfa())updata();
printf("%d",ans);
return 0;
}
[日常摸鱼]pojKaka's Matrix Travels-拆点+最大费最大流的更多相关文章
- [日常摸鱼]bzoj2724蒲公英-分块
区间众数经典题~ http://begin.lydsy.com/JudgeOnline/problem.php?id=4839这里可以提交~ 题意大概就是没有修改的询问区间众数,如果有一样的输出最小的 ...
- [日常摸鱼]bzoj2875[NOI2012]随机数生成器-矩阵快速幂
好裸的矩阵快速幂-然而我一开始居然构造不出矩阵- 平常两个的情况都是拿相邻两项放在矩阵里拿去递推的-然后我就一直构造不出来-其实把矩阵下面弄成1就好了啊orz #include<cstdio&g ...
- [日常摸鱼]HDU2157 How many ways??
hhh我又开始水题目了 题意:给一张有向图,多次询问一个点到另一个点刚好走$k$步的方案数取模,点数很小 每个$a,b,k$的询问直接把邻接矩阵$map$自乘$k$次后$map[a][b]$就是答案了 ...
- [日常摸鱼]poj2778 DNA Sequence
这题太神啦 题意:求长度为$n$的不包含给定DNA序列的DNA序列个数,给定的不超过10个 构建出Trie图,用$danger[i]$来表示不能走到$i$,对于DNA序列结尾的结点$danger$设为 ...
- [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵
今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_ (然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑) 题目:bzoj1444 先用字符串构 ...
- Hash 日常摸鱼笔记
本篇文章是Hash在信息学竞赛中的应用的学习笔记,分多次更新(已经有很多坑了) 一维递推 首先是Rabin-Karp,对于一个长度为\(m\)的串\(S\) \(f(S)=\sum_{i=1}^{m} ...
- [日常摸鱼]HDU1724 Ellipse-自适应Simpson法
模板题~ QAQ话说Simpson法的原理我还是不太懂-如果有懂的dalao麻烦告诉我~ 题意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积 Simpson法 (好像有时候也被 ...
- [日常摸鱼]bzoj1257余数之和
题意:输入$k,n$,求$\sum_{i=1}^n k \mod i$ $k \mod i=k-i*\lfloor \frac{k}{i} \rfloor $,$n$个$k$直接求和,后面那个东西像比 ...
- [日常摸鱼]bzoj1001狼抓兔子-最大流最小割
题意就是求最小割- 然后我们有这么一个定理(最大流-最小割定理 ): 任何一个网络图的最小割中边的容量之和等于图的最大流. (下面直接简称为最大流和最小割) 证明: 如果最大流>最小割,那把这些 ...
随机推荐
- Kafka入门(安装及使用)
Kafka是一种分布式的,基于发布/订阅的消息系统. Kafka的组成包括: Kafka将消息以topic为单位进行归纳. 将向Kafka topic发布消息的程序成为producers. 将预订to ...
- 企业级工作流解决方案(十五)--集成Abp和ng-alain--Abp其他改造
配置功能增强 Abp定义了各种配置接口,但是没有定义这些配置数据从哪里来,但是管理配置数据对于一个应用程序来说,是必不可少的一件事情. .net的配置数据管理,一般放在Web.config文件或者Ap ...
- 加密PDF文件,提高文件安全性
PDF文件的一大优点是可以设置文件的安全性,不仅可以通过证书加密的形式加密文件,还可以通过pdfFactory来设置密码的形式加密文件. 我们可以通过两种方式开启"PDF加密"来为 ...
- 怎么理解虚拟 DOM?
一.前言 现在web前端的开发,对于MVVM框架的运用,那是信手拈来,用的飞起.一个xxx-cli工具,就能初始化一套模板,再填充业务代码,打包部署即可.但是会用,是一个方面,大家有没有底层深入思考一 ...
- Java设计模式——观察者模式的灵活应用
灵感来源于一个猪队友给我的题目 看到这个,我抓住的关键字是:任何子任务失败,要通知所有子任务执行取消逻辑. 这不就是消息广播吗?观察者模式! 干活 首先是收听者 package com.example ...
- X86中断/异常与APIC
异常(exception)是由软件或硬件产生的,分为同步异常和异步异常.同步异常即CPU执行指令期间同步产生的异常,比如常见的除零错误.访问不在RAM中的内存 .MMU 发现当前虚拟地址没有对应的物理 ...
- Visual Studio 连接 SQL Server 关键代码
首先先把Visual Studio 上面工具打开-->连接数据库-->选择Microsoft SQL Server进入(有两种验证方式:1.windows验证方式[就是本机验证]:2.SQ ...
- 冲刺随笔——Day_Four
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 ...
- JZOJ8月10日提高组反思
JZOJ8月10日提高组反思 T1 没想到怎么打 就去打暴力了 本来想拿个30不错了 结果\(AC\)了 话说回来,数据也挺小的 T2 不AC便爆0 就一个数据点 给不给打暴力的人活了 正解是状压DP ...
- 学习abp vnext框架到精简到我的Vop框架
学习目标 框架特点 基于.NET 5平台开发 模块化系统 极少依赖 极易扩展 ....... 框架目的 学习.NET 5平台 学习abp vnext 上图大部分功能已经实现,多数是参考(copy)ab ...