题目描述


这是在阿尔托利亚·潘德拉贡成为英灵前的事情,她正要去拔出石中剑成为亚瑟王,在这之前她要去收集一些宝石。
宝石排列在一个n*m的网格中,每个网格中有一块价值为v(i,j)的宝石,阿尔托利亚·潘德拉贡可以选择自己的起点。
开始时刻为0秒。以下操作,每秒按顺序执行

  1. 在第i秒开始的时候,阿尔托利亚·潘德拉贡在方格(x,y)上,她可以拿走(x,y)中的宝石。
  2. 在偶数秒,阿尔托利亚·潘德拉贡周围四格的宝石会消失
  3. 若阿尔托利亚·潘德拉贡第i秒开始时在方格(x,y)上,则在第i+1秒可以立即移动到(x+1,y),(x,y+1),(x-1,y)或(x,y-1)上,也可以停留在(x,y)上。

求阿尔托利亚·潘德拉贡最多可以获得多少价值的宝石

输入格式

第一行给出数字N,M代表行列数.N,M均小于等于100,宝石的价值不会超过10000.下面N行M列用于描述数字矩阵

输出格式

输出最多可以拿到多少价值宝石

输入输出样例

输入 #1
2 2
1 2
2 1
输出 #1
4

说明/提示

姚金宇的原创题。

代码:

include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define R register
#define inf 1e9+7 using namespace std;
const int Excalibur = 10005;//N或MAXN
int n, m, S, T, cur[Excalibur], dep[Excalibur];
struct saber {//edge,我的王
int nxt, to, v;
}rin[Excalibur<<3];//是凛哦
int Lancer[Excalibur], Fate = 1, Archar;//emmm,head和tot以及sum
int x[5] = {0, -1, 0, 1, 0}, y[5] = {0, 0, -1, 0, 1}; inline void add(int from, int to, int v) {
rin[++Fate].v = v;
rin[Fate].to = to;
rin[Fate].nxt = Lancer[from];
Lancer[from] = Fate;
} inline bool bfs(int s, int t) {
queue<int> Rider;//q
for(R int i = 0;i <= T;++ i) cur[i] = Lancer[i], dep[i] = 0;
Rider.push(s); dep[s] = 1;
while(!Rider.empty()) {
R int vi = Rider.front();
Rider.pop();
for(R int i = Lancer[vi]; i ;i = rin[i].nxt) {
R int vc = rin[i].to;
if(!dep[vc] && rin[i].v) {
dep[vc] = dep[vi] + 1;
Rider.push(vc);
}
}
}
return dep[t];
} int dfs(int s, int t, int flow) {
if(!flow || s == t) return flow;
int Caster = 0, Assassin;//增量
for(R int i = cur[s]; i ;i = rin[i].nxt) {
R int vc = rin[i].to;
cur[s] = i;
if(dep[vc] == dep[s] + 1 && rin[i].v) {
Assassin = dfs(vc, t, min(flow, rin[i].v));
if(!Assassin) continue;
Caster += Assassin; flow -= Assassin;
rin[i].v -= Assassin; rin[i ^ 1].v += Assassin;
if(!flow) return Caster;
}
}
return Caster;
} int Dinic() {
int res = 0;
while(bfs(S, T)) res += dfs(S, T, inf);
return Archar - res;
} int main() {
scanf("%d%d",&n, &m);
//以下是建图,中二到此结束
S = 0, T = n * m + 1;
for(R int i = 1;i <= n;++ i)
for(R int j = 1;j <= m;++ j) {
R int v; scanf("%d",&v);
Archar += v;
R int p = (i - 1) * m + j;
if((i + j) & 1) { add(S, p, v);add(p, S, 0); }
else { add(p, T, v);add(T, p, 0); }
}
for(R int i = 1;i <= n;++ i) for(R int j = 1;j <= m;++ j)
if((i + j) & 1)
for(R int k = 1;k <= 4;++ k) {
R int f = i + x[k], g = j + y[k];
if(f < 1 || f > n || g < 1 || g > m) continue;
R int u = (i - 1) * m + j, v = (f - 1) * m + g;
add(u, v, inf); add(v, u, 0);
}
printf("%d",Dinic());
return 0;
}

【luogu4474王者之剑】--网络流的更多相关文章

  1. P4474 王者之剑

    P4474 王者之剑 题目大意 n*m的带权网格,任意选择起点开始时刻为0秒.以下操作,每秒按顺序执行 在第i秒开始的时候,在方格(x,y)上,获得(x,y)的值 在偶数秒,周围四格的值清零 每秒可选 ...

  2. plain framework 1 网络流 缓存数据详解

    网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...

  3. 网络流模板 NetworkFlow

    身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...

  4. COGS732. [网络流24题] 试题库

    «问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...

  5. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

  6. BZOJ 3144 [Hnoi2013]切糕 ——网络流

    [题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...

  7. bzoj3572又TM是网络流

    = =我承认我写网络流写疯了 = =我承认前面几篇博文都是扯淡,我写的是垃圾dinic(根本不叫dinic) = =我承认这道题我调了半天 = =我承认我这道题一开始是T的,后来换上真正的dinic才 ...

  8. hdu3549还是网络流

    最后一次训练模板(比较熟练了) 接下来训练网络流的建图 #include <cstdio> #define INF 2147483647 int n,m,ans,x,y,z,M,h,t,T ...

  9. 二分图&网络流&最小割等问题的总结

    二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...

随机推荐

  1. SAS学习笔记50 SAS数据集索引

    在没有索引的情况下,SAS是一条接一条的扫描观测:有索引时,直接跳到该索引对应的观测所在位置.总结一句话就是:节省时间,节省内存,提高效率 当然并不是任何情况下使用索引都能提高工作效率,因为建立索引本 ...

  2. Spring Cloud Alibaba学习笔记(13) - Spring Cloud Stream的监控与异常处理

    Spring Cloud Stream监控 Spring Boot Actuator组件用于暴露监控端点,很多监控工具都需要依赖该组件的监控端点实现监控.而项目集成了Stream及Actuator后也 ...

  3. javascript 之 扩展对象

    注意点:在js中常见的几种方进行扩展 第一种:ES6提供的 Object.assign(); 第二种:ES5提供的 extend()方法 第三种:Object对象提供的 defineProperty( ...

  4. vs项目模板创建和使用

    一.使用dotnet命令创建(适用于.NET Core,可以创建包含任意数量个项目的模板,但不会出现在vs的新建项目模板中) 官方文档:https://docs.microsoft.com/zh-cn ...

  5. docker第二章--数据管理

  6. 学习到目前,自己封装的db类和pdo类

    DB封装类 <?php class DBDA { public $host = "localhost"; public $uid = "root"; pu ...

  7. k8s中的网络(较详细汇总)

    目录 一.网络前提条件-网络模型 二.需要解决的网络问题 1.容器和容器之间的网络 2.pod与pod之间的网络 同一台node节点上pod和pod通信 不同node节点上pod和pod通信 3.po ...

  8. Harbor高可用理论及实践(汇聚篇)

    目录 一.理论概述 什么是harbor harbor要解决的问题 有了docker自带的registry为什么还要用harbor harbor的架构组件 Harbor工作原理 二.部署harbor及其 ...

  9. python中实现一个简单的进度条

    import time def progress(n,a): m = int(n / a * 100) x = int(n / a * 10) time.sleep(0.2) #只是为了让进度条明显 ...

  10. 关于strlen和sizeof的使用

    在学习C语言中发现strlen和sizeof的关系不是很明确,今天来总结一下这两个的区别: sizeof 是运算符,用来计算字节数,在计算字符串数组大小时包含(\0) 在编译时计算大小,参数可以是数组 ...