Description

给出一个 \(n*n\) 的矩阵,每一格有一个非负整数 \(A_{i,j}\) ,(\(A_{i,j} <= 1000\))现在从 \((1,1)\) 出发,可以往右或者往下走,最后到达 \((n,n)\) ,每达到一格,把该格子的数取出来,该格子的数就变成 \(0\) ,这样一共走 \(K\) 次,现在要求 \(K\) 次所达到的方格的数的和最大

Solution

一条边 \((a,b)\) 表示容量为 \(a\) ,费用为 \(b\) 。

把每个点拆成两个点,入点和出点。入点用来接受边,出点用来发出边

源点向 \((1,1)\) 连一条边 \((k,0)\) ,\((n,n)\) 向汇点连一条 \((k,0)\) ,表示可以走 \(k\) 次

每个点往他的右和下分别连一条 \((\infty, 0)\) 表示联通关系

每个点的入点与出点之间连两条边 \((1,x)\) 和 \((\infty, 0)\)。\(x\) 是该点的权值。

这是因为每个点只能取一次。

然后跑一遍最大费用最大流就完事啦

小技巧:把费用取负然后跑最小费用最大流

Code

#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000000;
const int N = 550;
int n, m, cnt, vis[N * N * 3], dis[N * N * 3];
int S, T, k, pre[N * N * 3], f[N * N * 3];
struct node {
int d, sid, tid;
}a[N][N];
struct edge {
int v, w, f; edge *next, *rev;
}pool[N * N * 2], *head[N * N * 3], *r[N * N * 3];
inline void addedge(int u, int v, int f, int w) {
edge *p = &pool[++cnt], *q = &pool[++cnt];
p->v = v, p->f = f, p->w = w, p->next = head[u], head[u] = p; p->rev = q;
q->v = u, q->f = 0, q->w = -w, q->next = head[v], head[v] = q; q->rev = p;
}
inline bool spfa() {
for(int i = S; i <= T; i++) r[i] = NULL, dis[i] = INF, vis[i] = 0, pre[i] = -1;
queue <int> Q; Q.push(S); vis[S] = 1; dis[S] = 0; f[S] = INF;
while(!Q.empty()) {
int u = Q.front(); Q.pop(); vis[u] = 0;
for(edge *p = head[u]; p; p = p->next) {
int v = p->v;
if(p->f > 0 && dis[v] > dis[u] + p->w) {
dis[v] = dis[u] + p->w;
pre[v] = u, r[v] = p;
f[v] = min(f[u], p->f);
if(!vis[v]) vis[v] = 1, Q.push(v);
}
}
}
return pre[T] != -1;
}
inline int MCMF() {
int ans = 0;
while(spfa()) {
for(int i = T; i != S; i = pre[i]) {
r[i]->f -= f[T]; r[i]->rev->f += f[T];
} ans += dis[T] * f[T];
} return ans;
}
int main() {
scanf("%d %d", &n, &k); S = 0, T = 2 * n * n + 1;
addedge(S, 1, k, 0);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
int x; scanf("%d", &x);
int id = (i - 1) * n + j;
a[i][j].sid = 2 * id - 1;
a[i][j].tid = 2 * id;
addedge(a[i][j].sid, a[i][j].tid, 1, -x);
addedge(a[i][j].sid, a[i][j].tid, INF, 0);
}
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
if(i < n) addedge(a[i][j].tid, a[i + 1][j].sid, INF, 0);
if(j < n) addedge(a[i][j].tid, a[i][j + 1].sid, INF, 0);
}
addedge(a[n][n].tid, T, k, 0);
printf("%d\n", -MCMF());
return 0;
}

题解【luogu2045 方格取数游戏加强版】的更多相关文章

  1. Luogu2045 方格取数加强版

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

  2. Luogu2045 方格取数加强版(K取方格数) 费用流

    题目传送门 题意:给出一个$N \times N$的方格,每个格子中有一个数字.你可以取$K$次数,每次取数从左上角的方格开始,每一次只能向右或向下走一格,走到右下角结束,沿路的方格中的数字将会被取出 ...

  3. 【P2405】方格取数问题加强版(费用流)

    考虑如何建图.还是老样子先拆点,然后把每两个点之间连接两条边,一条流量为1,费用为-点权,处理是否走这个点.一条流量无限,没有费用,因为哪怕一个点选过了,它的地方还是可以重复走过去的. 然后把经由一个 ...

  4. 题解 P1004 方格取数

    传送门 动态规划Yes? 设i为路径长度,(为什么i这一维可以省掉见下)f[j][k]表示第一个点到了(j,i-j),第二个点到了(k,j-k) 则 int ji=i-j,ki=i-k; f[j][k ...

  5. [luogu_P2045]方格取数加强版

    [luogu_P2045]方格取数加强版 试题描述 给出一个 \(n \times n\) 的矩阵,每一格有一个非负整数 \(A_{i,j},(A_{i,j} \le 1000)\) 现在从 \((1 ...

  6. 棋盘DP三连——洛谷 P1004 方格取数 &&洛谷 P1006 传纸条 &&Codevs 2853 方格游戏

    P1004 方格取数 题目描述 设有N $\times N$N×N的方格图(N $\le 9$)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00.如下图所示(见样例): A ...

  7. P2045 方格取数加强版

    P2045 方格取数加强版 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格 ...

  8. 洛谷 P1004 方格取数 题解

    P1004 方格取数 题目描述 设有 \(N \times N\) 的方格图 \((N \le 9)\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字\(0\).如下图所示(见样例): ...

  9. HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]

    题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...

随机推荐

  1. Redis 总结精讲 看一篇成高手系统4

    本文围绕以下几点进行阐述 1.为什么使用redis2.使用redis有什么缺点3.单线程的redis为什么这么快4.redis的数据类型,以及每种数据类型的使用场景5.redis的过期策略以及内存淘汰 ...

  2. PReLU——Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

    1. 摘要 在 \(ReLU\) 的基础上作者提出了 \(PReLU\),在几乎没有增加额外参数的前提下既可以提升模型的拟合能力,又能减小过拟合风险. 针对 \(ReLU/PReLU\) 的矫正非线性 ...

  3. 简单主机批量管理工具(这里实现了paramiko 用su切换到root用户)

    项目名:简单主机批量管理工具 一.需求 1.主机分组 2.可批量执行命令.发送文件,结果实时返回,执行格式如下 batch_run  -h h1,h2,h3   -g web_clusters,db_ ...

  4. 使用qemu启动dd制作的img镜像

    1. 准备工作 应用场景 在需要单机取证时,需要在不影响对象业务的情况下进行取证或分析,可以使用dd 对目标服务器进行镜像,生成img文件,镜像可以通过winhex进行静态分析.但是想要动态分析服务器 ...

  5. WeakHashMap介绍

    WeakHashMap简介 WeakHashMap 继承于AbstractMap,实现了Map接口.    和HashMap一样,WeakHashMap 也是一个散列表,它存储的内容也是键值对(key ...

  6. World Cup(思维+模拟)

    Description Allen wants to enter a fan zone(球迷区) that occupies a round square and has nn entrances. ...

  7. 王者荣耀交流协会final发布中间产物

    WBS+PSP 版本控制报告 软件功能说明书final修订

  8. Android开发第二阶段(5)

    今天:对图片的替换修改,使整个app的图案化更美观. 明天:对Android的对sdcard的操作学习

  9. 【转】nodeJs学习之项目结构

    新建的项目结构应该是这样 bin:项目的启动文件,也可以放其他脚本. node_modules:用来存放项目的依赖库. public:用来存放静态文件(css,js,img). routes:路由控制 ...

  10. php伪静态配置

    配置虚拟主机和伪静态 1.开启Apache的rewrite模块 LoadModule rewrite_module modules/mod_rewrite.so 2.开启虚拟主机功能 # Virtua ...