1227 方格取数 2

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 大师 Master

查看运行结果

题目描述 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

分类标签 Tags

网络流 费用流 图论

/*
拆点+费用流.
自己yy不对然后看的题解orz.
考虑两个东西.
一是计算答案贡献并保证贡献只计算一次.
二是使图连通.
通过一我们很容易想到拆点后建一条流量为1费用为格子贡献的边.
通过二拆点后建一条流量为k-1费用为0的边.
然后把(i,j)与(i-1,j)和(i,j-1)连接起来.
*/
#include<iostream>
#include<cstdio>
#include<queue>
#define MAXN 10010
#define INF 1e9
using namespace std;
int n,k,ans,cut=1,tot,S,T,head[MAXN],g[51][51],dis[MAXN],b[MAXN],fa[MAXN];
struct data{int u,v,next,c,f;}e[MAXN*2];
queue<int>q;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void add(int u,int v,int c,int f)
{
e[++cut].u=u;e[cut].v=v;e[cut].c=c;e[cut].f=f;e[cut].next=head[u];head[u]=cut;
e[++cut].u=v;e[cut].v=u;e[cut].c=0;e[cut].f=-f;e[cut].next=head[v];head[v]=cut;
}
bool bfs(int t)
{
q.push(S);
for(int i=0;i<=T;i++) dis[i]=-INF;dis[S]=0;
while(!q.empty())
{
int u=q.front();q.pop();b[u]=0;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(dis[v]<dis[u]+e[i].f&&e[i].c)
{
dis[v]=dis[u]+e[i].f,fa[v]=i;
if(b[v]!=t) b[v]=t,q.push(v);
}
}
}
return dis[T]!=-INF;
}
void mincost()
{
int t=1;
while(bfs(t))
{
int tmp=fa[T],x=INF;
while(tmp) x=min(x,e[tmp].c),tmp=fa[e[tmp].u];
tmp=fa[T];
while(tmp)
{
e[tmp].c-=x;
e[tmp^1].c+=x;
tmp=fa[e[tmp].u];
}
ans+=dis[T]*x;
}
return ;
}
int main()
{
n=read(),k=read();S=0,T=2*n*n+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=read(),tot+=g[i][j];
add(0,1,k,0),add(2*n*n,T,k,0);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
add((i-1)*n+j,(i-1)*n+j+n*n,1,g[i][j]),
add((i-1)*n+j,(i-1)*n+j+n*n,k-1,0);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i!=n) add((i-1)*n+j+n*n,i*n+j,k,0);
if(j!=n) add((i-1)*n+j+n*n,(i-1)*n+j+1,k,0);
}
mincost();
printf("%d",ans);
return 0;
}

Codevs 1227 方格取数 2(费用流)的更多相关文章

  1. codevs 1227 方格取数 2

    Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来, ...

  2. 洛谷 - P2045 - 方格取数加强版 - 费用流

    原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...

  3. 洛谷P2045 方格取数加强版(费用流)

    题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次, ...

  4. LG2045 方格取数加强版 费用流

    问题描述 LG2045 题解 费用流. 套路拆点,把\((i,j)\)拆为两个点,在这两个点之间连边:一条边流量为\(1\),费用为\(a_{i,j}\),另一条边为流量为\(INF\),费用为\(0 ...

  5. Codevs 1043 方格取数

    1043 方格取数 2000年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descri ...

  6. 【费用流】【CODEVS】1227 方格取数2

    [算法]最小费用最大流(费用流) [题解] 费用流:http://www.cnblogs.com/onioncyc/p/6496532.html 本题构图: 在有限的k次行走中尽可能多的拿到数字,明显 ...

  7. 【wikioi】1227 方格取数 2(费用流)

    http://www.wikioi.com/problem/1227 裸题,拆点,容量为1,费用为点权的负数(代表只能取一次).再在拆好的两个点连边,容量为oo,费用为0.(代表能取0) 然后向右和下 ...

  8. codevs 1907 方格取数 3

    Description 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. Input 第 ...

  9. poj3422K方格取数——最大费用最大流

    题目:http://poj.org/problem?id=3422 最大费用最大流: 拆点,在自点之间连两条边,一条容量为1,边权为数字:一条容量为k-1,边权为0:表示可以走k次,只有一次能取到数字 ...

随机推荐

  1. linux下的打包与解包的简单总结

    .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ---------------------- ...

  2. 【转载】C#使用is关键字检查对象是否与给定类型兼容

    在C#的编程开发过程中,很多时候涉及到数据类型的转换,如果强行转换数据类型,有时候可能会出现程序运行时错误,C#语言中提供了is关键字可以检查对象是否与给定类型兼容,可先判断类型兼容后再进行对象的转换 ...

  3. 常见的CSS样式

    常见的css样式 color 文字颜色 background-color 背景颜色 opacity 设置透明度 颜色: 光的三原色: 红 绿 蓝 三种颜色表示法: 名词表示法: red green b ...

  4. rem em min-width: 30em 的意思

    30em=30rem=30x16px=480px @media only screen and (min-width:30 em){ }

  5. ELK文档-安装部署

    一.ELK简介 请参考:http://www.cnblogs.com/aresxin/p/8035137.html 二.ElasticSearch安装部署 请参考:http://blog.51cto. ...

  6. TLS之殇如何把我逼上绝望

    1.协议的形式化分析,前提是弄清楚协议结构和协议参与者之间的会话交互,以及会话之间使用的加解密算法,签名算法,认证算法,等牵扯的算法.之后便是将要分析的协议部分进行抽象化,具体抽象涉及协议参与者(发起 ...

  7. Innodb关键特性之自适用Hash索引

    一.索引的资源消耗分析 1.索引三大特点 1.小:只在一个到多个列建立索引 2.有序:可以快速定位终点 3.有棵树:可以定位起点,树高一般小于等于3 2.索引的资源消耗点 1.树的高度,顺序访问索引的 ...

  8. SpringBoot框架之通用mapper插件(tk.mybatis)

    一.Tkmybatis的好处 Tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效.这个插件里面封装好了我们需要用到的很多sql语句,不过这个插件是通过我们去调用它封装的各种 ...

  9. 工程代码不编译src的java目录下的xml文件问题及解决

    IDEA的maven项目中,默认源代码目录下(src/main/java目录)的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉.如果使用的是Eclipse,Eclip ...

  10. 实例演示MaxTenuringThreshold参数及阈值动态调整策略

    在上一次[https://www.cnblogs.com/webor2006/p/11031563.html]学习了一个新的JVM对象晋升到老年代的参数“MaxTenuringThreshold”,它 ...