Codevs 1227 方格取数 2(费用流)
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(费用流)的更多相关文章
- codevs 1227 方格取数 2
Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来, ...
- 洛谷 - P2045 - 方格取数加强版 - 费用流
原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...
- 洛谷P2045 方格取数加强版(费用流)
题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次, ...
- LG2045 方格取数加强版 费用流
问题描述 LG2045 题解 费用流. 套路拆点,把\((i,j)\)拆为两个点,在这两个点之间连边:一条边流量为\(1\),费用为\(a_{i,j}\),另一条边为流量为\(INF\),费用为\(0 ...
- Codevs 1043 方格取数
1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descri ...
- 【费用流】【CODEVS】1227 方格取数2
[算法]最小费用最大流(费用流) [题解] 费用流:http://www.cnblogs.com/onioncyc/p/6496532.html 本题构图: 在有限的k次行走中尽可能多的拿到数字,明显 ...
- 【wikioi】1227 方格取数 2(费用流)
http://www.wikioi.com/problem/1227 裸题,拆点,容量为1,费用为点权的负数(代表只能取一次).再在拆好的两个点连边,容量为oo,费用为0.(代表能取0) 然后向右和下 ...
- codevs 1907 方格取数 3
Description 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. Input 第 ...
- poj3422K方格取数——最大费用最大流
题目:http://poj.org/problem?id=3422 最大费用最大流: 拆点,在自点之间连两条边,一条容量为1,边权为数字:一条容量为k-1,边权为0:表示可以走k次,只有一次能取到数字 ...
随机推荐
- java 简单操作HDFS
创建java 项目 package com.yw.hadoop273; import org.apache.hadoop.conf.Configuration; import org.apache.h ...
- Vue.js源码全方位深入解析--学习笔记
模板中的插入变量是如何渲染到DOM上的? initMixin(Vue)->_init->$options-> $mount()当执行该挂载方法时DOM变化 为什么可以通过this访问 ...
- linux命令行删除N天前的数据的命令
命令: find . -mtime +N -type f -name "*.log.*" -exec rm -f {} \; 简单解释: find .查询 ; -mtime 规 ...
- Python虚拟环境virtualenv的安装与使用详解(转)
virtualenv参考:https://www.jb51.net/article/114933.htm virtualenvwrapper参考:https://www.jianshu.com/p/7 ...
- 【SQL Server DBA】维护语句:删除并创建外键约束、获取建表语句
原文:[SQL Server DBA]维护语句:删除并创建外键约束.获取建表语句 1.删除外键约束,建立外键约束 先建立3个表: /* drop table tb drop table tb_b dr ...
- 使用代码浏览WPF控件模版
纯代码创建,不需要创建界面,创建WPF工程后,直接复制代码就可以使用. 当你手头没有Blend,又不记得以下这段代码,但是又想浏览控件模版的时候,就可以直接复制拿来用了. public partial ...
- c# 调试过程
- Python基础Day6
一.代码块 一个模块(模块就是py文件),一个函数,一个类,一个文件都是一个代码块,一个整体是一个代码块. 交互模式的每一行都是一个代码块(交互模式:命令提示符),相当于每行都在不同的文件 二.id ...
- 某公司git代码管理,到如何上线
- 如何写好demo——学习感悟
文章标题:教你如何写好Demo应用 如何制作出最有用的demo呢? 简,易 在demo中,我们要专注于单一的主题.我们的教学覆盖了很大的知识范围,因此,化整为零是非常必要的. 例如,我们要说明Andr ...