codevs 1227 方格取数 2
Description
给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走K次,现在要求K次所达到的方格的数的和最大
Input Description
第一行两个数n,k(1<=n<=50, 0<=k<=10)
接下来n行,每行n个数,分别表示矩阵的每个格子的数
Output Description
一个数,为最大和
Sample Input
3 1
1 2 3
0 2 1
1 4 2
Sample Output
11
Data Size & Hint
1<=n<=50, 0<=k<=10
恩......说实话这道题应该是网络流的题,但是想了半天也没有想出来......膜了网上的题解后才发现,这是道费用流的题(亏我一直在想怎么控制和最大)
知道这是费用流的以后就很好办了。由于每个点可能有两种情况,即之前没经过这个点时走到这个点,和之前已经走过这个点了。前一种情况需要计算贡献,而后一种情况则不需要。
然后,我们考虑如何控制这两种情况。我们可以将每个点x拆开,拆为x1与x2。这样每次从x1走到x2时就可以把这个点的贡献给算进去。由于前一种情况只有一次,而后一种情况最多有k-1次,所以我们在x1与x2之间连两种边,一种容量为1,费用为这个节点的值(对应第一种情况),另一种容量为k-1,费用为0(对应第二种情况)。然后考虑这个点往下和往右连边,假设这两个点分别为y,z,那么从x2往y1、z1分别连一条容量为k,费用为0的边即可(自己想一想,不难的)。然后跑一遍最大费用最大流即可。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 100010
#define INF (1<<28)
#define r(j) (j^1) using namespace std;
typedef long long llg; int head[maxn],to[maxn],next[maxn],c[maxn],f[maxn],ff[maxn];
int n,k,tt=,ans,dis[maxn],d[maxn],fa[maxn],d2[maxn],l,r,hui;
bool w[maxn]; void link(int x,int y,int z,int o){
to[++tt]=y;next[tt]=head[x];head[x]=tt;
to[++tt]=x;next[tt]=head[y];head[y]=tt;
c[tt-]=z; f[tt-]=o; f[tt]=-o;
} bool spfa(){
for(int i=;i<=hui;i++) dis[i]=-,d2[i]=INF;
dis[]=; l=r=; d[r++]=; w[]=;
while(l!=r){
int u=d[l++]; l%=maxn; w[u]=;
for(int i=head[u],v;v=to[i],i;i=next[i])
if(c[i]> && dis[v]<dis[u]+f[i]){
dis[v]=dis[u]+f[i];
d2[v]=min(d2[u],c[i]);
fa[v]=u; ff[v]=i;
if(!w[v]){
w[v]=;d[r++]=v;
r%=maxn;
}
}
}
if(dis[hui]==-) return ;
ans+=dis[hui]*d2[hui];
int now=hui;
while(now!=){
c[ff[now]]-=d2[hui];
c[r(ff[now])]+=d2[hui];
now=fa[now];
}
return ;
} int main(){
File("a");
scanf("%d%d",&n,&k);hui=n*n<<;
for(int i=,now=,x;i<=n;i++)
for(int j=;j<=n;j++,now++){
scanf("%d",&x);
link(now,now+n*n,,x); link(now,now+n*n,k-,);
if(j<n) link(now+n*n,now+,k,);
if(i<n) link(now+n*n,now+n,k,);
}
while(spfa());
printf("%d",ans);
return ;
}
codevs 1227 方格取数 2的更多相关文章
- Codevs 1227 方格取数 2(费用流)
1227 方格取数 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 查看运行结果 题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数 ...
- Codevs 1043 方格取数
1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descri ...
- 【wikioi】1227 方格取数 2(费用流)
http://www.wikioi.com/problem/1227 裸题,拆点,容量为1,费用为点权的负数(代表只能取一次).再在拆好的两个点连边,容量为oo,费用为0.(代表能取0) 然后向右和下 ...
- codevs 1907 方格取数 3
Description 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. Input 第 ...
- 【费用流】【CODEVS】1227 方格取数2
[算法]最小费用最大流(费用流) [题解] 费用流:http://www.cnblogs.com/onioncyc/p/6496532.html 本题构图: 在有限的k次行走中尽可能多的拿到数字,明显 ...
- codevs——T1043 方格取数
http://codevs.cn/problem/1043/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 De ...
- codevs 1043 方格取数 2000年NOIP全国联赛提高组
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而 ...
- codevs 方格取数
1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descri ...
- tyvj 1884 [NOIP2000T4]方格取数 || codevs 1043 dp
P1884 [NOIP2000T4]方格取数 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 [noip2000T4]方格取数 描述 设有N*N的方格图(N& ...
随机推荐
- IOS 杂笔-1(为什么不继承类簇?)
答:首先,类簇是可以继承的,并不是不可以.例如,我们可以选择继承NSSting,但是此时你用你自己设定的类去调用NSSting的一些方法时,会存在无法实现的问题,这是为什么呢. 1.类簇里有很多私有的 ...
- jQuery删除节点和追加节点
for (var i in checkedBoxIds) { var $td = $("#" + checkedBoxIds[i]).parent().parent().detac ...
- 源码编译安装gcc-5.3.0
系统环境:Amazon Linux AMI 2015.09.2 (HVM)---Fedora 23 Server 1.下载gcc-5.3.0安装包并将gcc-5.3.0.tar.gz放到/opt目录下 ...
- LB 简单比较 – F5、NetScaler、LVS、Nginx、Haproxy
LB 简单比较 – F5.NetScaler.LVS.Nginx.Haproxy 负载均衡技术是构建大型网站必不可少的架构策略之一.它的目的是,把用户的请求分发到多台后端的设备上,用以均衡服务器的负载 ...
- C# 和 C++ 数据类型对照表
又要用C#调用C++写好的api函数,为了方便,将网上的数据类型做个整理,方便以后查找,以后遇到需要的在进行查找 C++ C# WORD ushort DWORD ui ...
- nsis制作启动Tomcat服务的exe安装包教程
一. 准备工作 下载nsis相关工具包,点击此下载 1. 安装程序:nsis-2.46-setup.exe 2. 编辑程序:cnisedit203.exe 3. 帮助文档:NSIS205帮助文档.ra ...
- 烂泥:CentOS6.5光盘以及ISO镜像文件的使用
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 学习CentOS有一段时间了,在平时使用过程中.系统镜像以及光盘使用的比较多,这篇文章就从实用的角度介绍相关有关光盘与镜像文件的使用. 因为物理机相关的 ...
- Linux工具之man手册彩色页设置
说明: 对于我们开发人员或者运维工程师来说,经常要查询某个系统命令或者C函数接口的使用方法,最好的最专业的资料就是man手册,通过一些设置可以让man手册页面显示适当颜色,方便阅读,增强美观性. 设置 ...
- ELF Format 笔记(五)—— 特殊 Section
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 链接器把一些独立的 object files 和库文件链接起来,形成可执行文件.在这个过程中,链接器需要解决 ...
- [转]12篇学通C#网络编程——第二篇 HTTP应用编程(上)
本文转自:http://www.cnblogs.com/huangxincheng/archive/2012/01/09/2316745.html 我们学习网络编程最熟悉的莫过于Http,好,我们就从 ...