codevs1227:方格取数2
题目描述 Description
给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= )现在从(,)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走K次,现在要求K次所达到的方格的数的和最大 输入描述 Input Description
第一行两个数n,k(<=n<=, <=k<=) 接下来n行,每行n个数,分别表示矩阵的每个格子的数 输出描述 Output Description
一个数,为最大和 样例输入 Sample Input 样例输出 Sample Output 数据范围及提示 Data Size & Hint
<=n<=, <=k<=
题目
芒果君:刚学的拆点,为数不多的自己写出来的网络流……理解题意后我们发现有以下几个要点:进行K次增广路;只能向右向下走;经过格点但可以不取数。那我们可以把每个格点拆成无权和有权的两个点。从其他点(同一位置有两个)走到该点,就走到无权点,流量视为inf,费用为0;当然也可以从同一点的无权走向有权,就是取出该数,只能取一次,流量是1,费用为负点权。左上连源点,右下连汇点。套KM的板子,最后的费用取相反数就是最大价值。注意建反边的费用是正边的相反数!
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<bitset>
#include<string>
#define maxn 20010
using namespace std;
typedef long long ll;
const int inf=<<;
queue<int>Q;
int n,cnt,hl[maxn],s,t,k,vis[maxn],dis[maxn],pre[maxn],flow[maxn],id[maxn],tot;
inline int cal(int x,int y){return (x-)*n+y;}
struct Edge{
int u,v,c,f,ne,ctr;
}e[];
void add(int u,int v,int c,int f,int ctr)
{
e[++cnt].u=u;
e[cnt].v=v;
e[cnt].c=c;
e[cnt].f=f;
e[cnt].ctr=cnt+ctr;
e[cnt].ne=hl[u];
hl[u]=cnt;
}
bool bfs()
{
for(int i=;i<=n*n*+;++i) dis[i]=inf,pre[i]=-,vis[i]=;
dis[s]=pre[s]=;
flow[s]=inf;
Q.push(s);
while(!Q.empty()){
int x=Q.front();
Q.pop();
vis[x]=;
for(int i=hl[x];i;i=e[i].ne){
int v=e[i].v,c=e[i].c,w=e[i].f;
if(c&&dis[v]>dis[x]+w){
dis[v]=dis[x]+w;
pre[v]=x;
id[v]=i;
flow[v]=min(flow[x],c);
if(!vis[v]){
vis[v]=;
Q.push(v);
}
}
}
}
return dis[t]<inf;
}
int KM()
{
int ret();
while(bfs()){
tot++;
if(tot>k) break;
int now=t;
while(now!=s){
int i=id[now],j=e[i].ctr;
e[i].c-=flow[t];
e[j].c+=flow[t];
now=pre[now];
}
ret+=flow[t]*dis[t];
}
return ret;
}
int main()
{
int w;
scanf("%d%d",&n,&k);
for(int i=;i<=n;++i)
for(int j=;j<=n;++j){
scanf("%d",&w);
add(cal(i,j),n*n+cal(i,j),,-w,);
add(n*n+cal(i,j),cal(i,j),,w,-);
}
puts("");
for(int i=;i<=n;++i)
for(int j=;j<=n;++j){
if(j+<=n){
add(cal(i,j),cal(i,j+),inf,,);
add(cal(i,j+),cal(i,j),,,-);
add(n*n+cal(i,j),cal(i,j+),,,);
add(cal(i,j+),n*n+cal(i,j),,,-);
}
if(i+<=n){
add(cal(i,j),cal(i+,j),inf,,);
add(cal(i+,j),cal(i,j),,,-);
add(n*n+cal(i,j),cal(i+,j),,,);
add(cal(i+,j),n*n+cal(i,j),,,-);
}
}
s=,t=n*n*+;
add(,,inf,,);add(,,,,-);
add(n*n,t,inf,,);add(t,n*n,,,-);
add(t-,t,inf,,);add(t,t-,,,-);
printf("%d\n",-KM());
return ;
}
codevs1227:方格取数2的更多相关文章
- [CodeVs1227]方格取数2(最大费用最大流)
网络流24题的坑还没填完,真的要TJ? 题目大意:一个n*n的矩阵,每格有点权,从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走 ...
- codevs1227 方格取数2 注意数组啊啊啊啊啊啊啊啊啊啊
一开始T了一组RE了一组,实在找不出错来,就把数组加了一个0竟然就多A了一组.很惊讶的又加了几个0最后竟然全A了!!! 懒得做了,改的是之前的那个蚯蚓的游戏问题.还是需要拆点,至于为什么不能重复走结点 ...
- HDU 1565&1569 方格取数系列(状压DP或者最大流)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- NOIP200003方格取数
NOIP200003方格取数 难度级别: D: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 XYZ 是首师大附中信息技术团编 ...
- vijos 1563 疯狂的方格取数
P1653疯狂的方格取数 Accepted 标签:天才的talent[显示标签] 背景 Due to the talent of talent123,当talent123做完NOIP考了两次的二取 ...
- [HDU 1565+1569] 方格取数
HDU 1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...
- HDU-1565 方格取数(1)
http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Me ...
- BZOJ 1475: 方格取数( 网络流 )
本来想写道水题....结果调了这么久!就是一个 define 里面少加了个括号 ! 二分图最大点权独立集...黑白染色一下 , 然后建图 : S -> black_node , white_no ...
随机推荐
- mutt/mail
邮件管理命令 发送和接收邮件
- 「CF319E」Ping-Pong「线段树」「并查集」
题意 规定区间\((a,b)\)到区间\((c,d)\)有边当且仅当\(c<a<d\)或\(c<b<d\). 起初区间集合为空.有\(n\)(\(n\leq 10^5\))次操 ...
- postgresql数据的入门教程
postgreSQL数据库简介 PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行. PostgreSQL 开发者把它念作 post-gress-Q- ...
- PHP 之Html标签转义与反转义
1.htmlentities()函数转义html 2.html_entity_decode()函数反转义html 我这里是用来反转义富文本编辑器的内容
- avalon background-image写法
ms-css="{backgroundImage: 'url('+reportdata.avatar + ')'}"
- Why use swap when there is more than enough RAM.
Swappiness is a property of the Linux kernel that changes the balance between swapping out runtime m ...
- @AUTORELEASEPOOL
Swift 在内存管理上使用的是自动引用计数 (ARC) 的一套方法,在 ARC 中虽然不需要手动地调用像是 retain,release 或者是 autorelease 这样的方法来管理引用计数,但 ...
- php手记(替代语法、COOKIE及时生效)
为方便区分流程语句的开始和结束位置,可以使用PHP提供的替代语法进行编码. 左花括号({) - 替换成 → 冒号(:) 右花括号(}) - 替换成 → "endif;" " ...
- arcgis python 参数类型和含义
数据类型 datatype 关键字 描述 地址定位器 DEAddressLocator 用于地理编码的数据集,存储地址属性.关联的索引以及用于定义将地点的非空间描述转换为空间数据这一过程的规则. 地址 ...
- SurfaceView概述和基本使用
Android屏幕刷新一遍时间间隔为16ms,如果view能够在16ms内完成所需要执行的绘图换作,那么在视觉上,界面就是流畅的,否则就会出现卡顿现象,在很多情况下,这些逻辑处理又是必须的,为了解决这 ...