方格取数的升级版,每个格子最多取一次。

$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-拆点+最大费最大流的更多相关文章

  1. [日常摸鱼]bzoj2724蒲公英-分块

    区间众数经典题~ http://begin.lydsy.com/JudgeOnline/problem.php?id=4839这里可以提交~ 题意大概就是没有修改的询问区间众数,如果有一样的输出最小的 ...

  2. [日常摸鱼]bzoj2875[NOI2012]随机数生成器-矩阵快速幂

    好裸的矩阵快速幂-然而我一开始居然构造不出矩阵- 平常两个的情况都是拿相邻两项放在矩阵里拿去递推的-然后我就一直构造不出来-其实把矩阵下面弄成1就好了啊orz #include<cstdio&g ...

  3. [日常摸鱼]HDU2157 How many ways??

    hhh我又开始水题目了 题意:给一张有向图,多次询问一个点到另一个点刚好走$k$步的方案数取模,点数很小 每个$a,b,k$的询问直接把邻接矩阵$map$自乘$k$次后$map[a][b]$就是答案了 ...

  4. [日常摸鱼]poj2778 DNA Sequence

    这题太神啦 题意:求长度为$n$的不包含给定DNA序列的DNA序列个数,给定的不超过10个 构建出Trie图,用$danger[i]$来表示不能走到$i$,对于DNA序列结尾的结点$danger$设为 ...

  5. [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵

    今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_ (然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑) 题目:bzoj1444 先用字符串构 ...

  6. Hash 日常摸鱼笔记

    本篇文章是Hash在信息学竞赛中的应用的学习笔记,分多次更新(已经有很多坑了) 一维递推 首先是Rabin-Karp,对于一个长度为\(m\)的串\(S\) \(f(S)=\sum_{i=1}^{m} ...

  7. [日常摸鱼]HDU1724 Ellipse-自适应Simpson法

    模板题~ QAQ话说Simpson法的原理我还是不太懂-如果有懂的dalao麻烦告诉我~ 题意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积 Simpson法 (好像有时候也被 ...

  8. [日常摸鱼]bzoj1257余数之和

    题意:输入$k,n$,求$\sum_{i=1}^n k \mod i$ $k \mod i=k-i*\lfloor \frac{k}{i} \rfloor $,$n$个$k$直接求和,后面那个东西像比 ...

  9. [日常摸鱼]bzoj1001狼抓兔子-最大流最小割

    题意就是求最小割- 然后我们有这么一个定理(最大流-最小割定理 ): 任何一个网络图的最小割中边的容量之和等于图的最大流. (下面直接简称为最大流和最小割) 证明: 如果最大流>最小割,那把这些 ...

随机推荐

  1. 纯干货分享!2020阿里java岗笔试面试题总结(附答案)

    前言 2020金九银十马上结束,现为大家整理了这次金九银十面试阿里的面试题总结,都是我从朋友那拿到的面试真题,话不多说,满满的干货分享给大家! int a=10是原子操作吗? 是的.  注意点: i+ ...

  2. 怎么给Folx添加需要储存的网站密码

    Folx内置密码管理功能,可以帮助用户储存特定网站的密码,实现更加快速的登陆下载操作.在Folx的免费版本中,用户最多可以存储2个密码:而Folx专业版则不限制用户存储密码的数量. Folx通过两种方 ...

  3. FL Studio音频混音教程

    FL Studio是一款音乐制作.编曲.混音软件,其内置众多电子合成音色,还支持第三方VST等格式插件.软件操作界面简洁易上手,即使你是零音乐基础小白,通过它也能轻松实现自己音乐梦想,很多人给他起了个 ...

  4. EasyRecovery帮您轻松拯救办公室断电后的文件丢失

    故事要从半个月前说起,某天中午,社畜小编得到了上头的传令,要为即将到来的双十一狂欢节写一个活动策划案. 想着时间也不是很充裕,还要留一些时间修修补补,于是小编连续三天挑灯夜战,终于在某天周五的晚上把策 ...

  5. api4excel - 接口自动化测试excel篇

    api4excel - 接口自动化测试excel篇 工作原理: 测试用例在excel上编辑,使用第三方库xlrd,读取表格sheet和内容,sheetName对应模块名,Jenkins集成服务发现服务 ...

  6. {"non_field_errors":["Unable to log in with provided credentials."]}% 无法使用提供的凭据登录

    在使用rest_framework_jwt进行登陆验证获取token的时候会报 {"non_field_errors":["Unable to log in with p ...

  7. 4 种高可用 RocketMQ 集群搭建方案!

    背景 笔者所在的业务线,最初化分为三个服务,由于业务初期业务复杂度相对简单,三个业务服务都能很好的独立完成业务功能. 随着产品迭代,业务功能越来越多后慢慢也要面对高并发.业务解耦.分布式事务等问题,所 ...

  8. dubbo ChannelHandler

    记得我们在做服务暴露的bind和服务调用的connect都有一个ExchangeHandler的实例作为入参: 这个handler最终会利用装饰者模式被封装若干层,Dubbo中提供了大量的Handle ...

  9. Java多线程中的wait/notify通信模式

    前言 最近在看一些JUC下的源码,更加意识到想要学好Java多线程,基础是关键,比如想要学好ReentranLock源码,就得掌握好AQS源码,而AQS源码中又有很多Java多线程经典的一些应用:再比 ...

  10. 腾讯云linux系统部署项目无法通过外网访问

    最近尝试使用了一下腾讯去的linux系统服务器,但是却遇到各种问题,下面记录的问题是项目部署完成后却无法通过外网访问. 服务器:腾讯云 系统 :CentOS 8.0 64位 处理思路:通过度娘百般摸索 ...