【luogu4474王者之剑】--网络流
题目描述

这是在阿尔托利亚·潘德拉贡成为英灵前的事情,她正要去拔出石中剑成为亚瑟王,在这之前她要去收集一些宝石。
宝石排列在一个n*m的网格中,每个网格中有一块价值为v(i,j)的宝石,阿尔托利亚·潘德拉贡可以选择自己的起点。
开始时刻为0秒。以下操作,每秒按顺序执行
- 在第i秒开始的时候,阿尔托利亚·潘德拉贡在方格(x,y)上,她可以拿走(x,y)中的宝石。
- 在偶数秒,阿尔托利亚·潘德拉贡周围四格的宝石会消失
- 若阿尔托利亚·潘德拉贡第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列用于描述数字矩阵
输出格式
输出最多可以拿到多少价值宝石
输入输出样例
2 2
1 2
2 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王者之剑】--网络流的更多相关文章
- P4474 王者之剑
P4474 王者之剑 题目大意 n*m的带权网格,任意选择起点开始时刻为0秒.以下操作,每秒按顺序执行 在第i秒开始的时候,在方格(x,y)上,获得(x,y)的值 在偶数秒,周围四格的值清零 每秒可选 ...
- plain framework 1 网络流 缓存数据详解
网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...
- 网络流模板 NetworkFlow
身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...
- COGS732. [网络流24题] 试题库
«问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...
- ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)
//有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...
- BZOJ 3144 [Hnoi2013]切糕 ——网络流
[题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...
- bzoj3572又TM是网络流
= =我承认我写网络流写疯了 = =我承认前面几篇博文都是扯淡,我写的是垃圾dinic(根本不叫dinic) = =我承认这道题我调了半天 = =我承认我这道题一开始是T的,后来换上真正的dinic才 ...
- hdu3549还是网络流
最后一次训练模板(比较熟练了) 接下来训练网络流的建图 #include <cstdio> #define INF 2147483647 int n,m,ans,x,y,z,M,h,t,T ...
- 二分图&网络流&最小割等问题的总结
二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...
随机推荐
- Java基础IO类之File类
大三了,目前基础太差了,重新学习过!代码如下,里面都有详细的解释每一行代码代表的意思~ package IODemo; import java.io.File; import java.io.File ...
- 如何自定义xml文件
在定义文件之前,首先要弄清楚什么是xml文件和dtd文件. 一:什么是xml文件? xml是一种可扩展标记性语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有构造性的标记语言. 二:什么事d ...
- Linux Nginx的权限——访问本地目录报错403
在安装好FastDFS并成功上传图片文件后,根据FastDFS返回的文件地址无法通过HTTP(即浏览器)访问到,报错404或者403. 不管是Error 404还是Error 403,基本都是Ngin ...
- SQL根据指定节点ID获取所有父级节点和子级节点(转载)
--根据指定节点ID获取所有子节点-- WITH TEMP AS ( ' --表的主键ID UNION ALL SELECT T0.* FROM TEMP,table_name T0 WHERE TE ...
- copy 合并
copy /b xxx.jpg + yyy.txt zzz.jpg /b 二进制 /a 文本
- VBA子程序(十六)
子程序(Sub Procedures,也叫子过程)与函数类似,但有一些差异. 子过程不需要有返回一个值,而函数可能会或可能不会有返回一个值. 子程序可以不用call关键字来调用. 子程序总是包含在Su ...
- 详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失
在Spring Cloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离. 在使用线程隔离的时候,有个问题是必须 ...
- 前端编译原理 parser.js源码解读
前面已经介绍了一个jison的使用,在正常开发中其实已经够用下,下面主要是看了下parser.js代码解读下,作为一些了解. 下面以最简单的文法产生的parser做一些代码注释 下面是一些注释,标示了 ...
- py 并发编程(线程、进程、协程)
一.操作系统 操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间. 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等.操作系统的内核的定义:操 ...
- (备忘)jeecg的$.dialog的一些参数
jeecg表单弹出框采用的技术是lhgdialog 一.配置全局默认参数 (function(config){ config['extendDrag'] = true; // 注意,此配置参数只能在这 ...