题目描述 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的更多相关文章

  1. [CodeVs1227]方格取数2(最大费用最大流)

    网络流24题的坑还没填完,真的要TJ? 题目大意:一个n*n的矩阵,每格有点权,从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走 ...

  2. codevs1227 方格取数2 注意数组啊啊啊啊啊啊啊啊啊啊

    一开始T了一组RE了一组,实在找不出错来,就把数组加了一个0竟然就多A了一组.很惊讶的又加了几个0最后竟然全A了!!! 懒得做了,改的是之前的那个蚯蚓的游戏问题.还是需要拆点,至于为什么不能重复走结点 ...

  3. HDU 1565&1569 方格取数系列(状压DP或者最大流)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. NOIP200003方格取数

    NOIP200003方格取数 难度级别: D: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 XYZ 是首师大附中信息技术团编 ...

  5. vijos 1563 疯狂的方格取数

    P1653疯狂的方格取数 Accepted 标签:天才的talent[显示标签]   背景 Due to the talent of talent123,当talent123做完NOIP考了两次的二取 ...

  6. [HDU 1565+1569] 方格取数

    HDU 1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)

      HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...

  8. HDU-1565 方格取数(1)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Me ...

  9. BZOJ 1475: 方格取数( 网络流 )

    本来想写道水题....结果调了这么久!就是一个 define 里面少加了个括号 ! 二分图最大点权独立集...黑白染色一下 , 然后建图 : S -> black_node , white_no ...

随机推荐

  1. About & Ideas & Queries

    About Blog主现高一,文化课和OI啥都不会 本Blog主太懒,所以很多内容都缩在一个文章里,如数学.图论大礼包 https://wenku.baidu.com/view/56d76029647 ...

  2. spring + spring mvc 使用 maven 编译出现异常

    异常如下: [INFO] Scanning for projects...[INFO] [INFO] ------------------------------------------------- ...

  3. C#中指针的简单使用

    原来C#不仅仅支持和C/C++中指针(或者说是引用)很像的委托delegate,还支持在unsafe代码块中使用指针,从而写非托管的代码(人为不让垃圾回收机制来管理相应的内存).在unsafe中就可以 ...

  4. mysqlslap压力测试时出现"Can't connect to MySQL server"

    mysqlslap -utest -h 192.168.1.12 -p'test' --concurrency=100 --iterations=500 --create-schema='my_db' ...

  5. ansible 主机正则

    ansible <pattern> -m <module_name> -a <arguments> 该功能主要针对Inventory的主机列表,案例如下: 1.AL ...

  6. java关于Integer设置-128到127的静态缓存

    今天在一个java群里,看到有个群友问到如下为什么第一个为true,第二个为false. System.out.println(Integer.valueOf("50")==Int ...

  7. Java网站视频资源加密

    ----------------------------------------------------------分享此文章,只为让版权能够得到更多的保护---------------------- ...

  8. postgresql 的 .pgpass密码文件的使用

    pgpass 是 连接 postgresql 时使用的密码文件,通常位置为 ~/.pgpass.在使用某些组件时还真的必须使用.具体的格式为: hostname:port:database:usern ...

  9. TXMLDocument 的使用

    TXMLDocument 的使用 TXMLDocument是DELPHI自带的操作XML的类. 需要它,需要引用单元: uses XMLDoc; var XMLDoc:TXMLDocument; XM ...

  10. <JavaScript>几道javascript练习题

    问题1: 作用域(Scope) 考虑以下代码: (function() { var a = b = 5; })(); console.log(b); 控制台(console)会打印出什么? 答案 上述 ...