题解 marshland
是个最大费用可行流
这题的建边很毒瘤
首先有危险度的点肯定要拆点
关键在于其它点怎么办
如果拆了不好保证每个点只经过一次
不拆连网络流都跑不了
但仔细观察题面,不能不难(???)发现一个L中那两个坐标和为偶数的点一定分两种
(奇, 奇)和(偶, 偶)
那可以用这个性质建边,一类连源点,一类连汇点就行了
- 所以总结是啥?坐标题善于发现坐标的奇偶性规律?
Code:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 5000
#define ll long long
#define fir first
#define sec second
#define make make_pair
//#define int long long
char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline int read() {
int ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
}
int n, m, k;
int head[N], size=1, val[55][55], tot, s1, s2, t, dis[N], inc[N], back[N], ans, sum;
bool lim[55][55], vis[N];
pair<int, int> mp[55][55];
struct edge{int to, next, flw, cst;}e[N<<3];
inline void add(int s, int t, int f, int c) {e[++size].to=t; e[size].flw=f; e[size].cst=c; e[size].next=head[s]; head[s]=size;}
bool spfa(int s, int t) {
//cout<<"spfa "<<s<<' '<<t<<endl;
memset(dis, 127, sizeof(dis));
memset(back, -1, sizeof(back));
dis[s]=0; inc[s]=INF;
queue<int> q;
q.push(s);
int u;
while (q.size()) {
u=q.front(); q.pop();
vis[u]=0;
for (int i=head[u],v; ~i; i=e[i].next) {
v = e[i].to;
if (e[i].flw && dis[v]>dis[u]+e[i].cst) {
dis[v]=dis[u]+e[i].cst;
//cout<<"dis: "<<dis[v]<<endl;
back[v]=i; inc[v]=min(inc[u], e[i].flw);
if (!vis[v]) q.push(v), vis[v]=1;
}
}
}
return ~back[t];
}
signed main()
{
memset(head, -1, sizeof(head));
n=read(); m=read(); k=read();
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
val[i][j]=read(), sum+=val[i][j]; //, cout<<val[i][j]<<endl;
for (int i=1,x,y; i<=k; ++i) {
x=read(); y=read();
lim[x][y]=1;
}
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
if (!lim[i][j]) {
if ((i+j)&1) mp[i][j]=make(tot+1, tot+2), tot+=2;
else mp[i][j]=make(++tot, 0);
}
s1=++tot, s2=++tot, t=++tot;
//cout<<"s: "<<s1<<' '<<s2<<' '<<t<<endl;
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j) if (!lim[i][j]) {
if ((i+j)&1) {
add(mp[i][j].fir, mp[i][j].sec, 1, -val[i][j]), add(mp[i][j].sec, mp[i][j].fir, 0, val[i][j]);
}
else {
if (i&1) {
add(s2, mp[i][j].fir, 1, 0), add(mp[i][j].fir, s2, 0, 0);
if (i<n && !lim[i+1][j]) add(mp[i][j].fir, mp[i+1][j].fir, 1, 0), add(mp[i+1][j].fir, mp[i][j].fir, 0, 0);
if (j<n && !lim[i][j+1]) add(mp[i][j].fir, mp[i][j+1].fir, 1, 0), add(mp[i][j+1].fir, mp[i][j].fir, 0, 0);
if (i>1 && !lim[i-1][j]) add(mp[i][j].fir, mp[i-1][j].fir, 1, 0), add(mp[i-1][j].fir, mp[i][j].fir, 0, 0);
if (j>1 && !lim[i][j-1]) add(mp[i][j].fir, mp[i][j-1].fir, 1, 0), add(mp[i][j-1].fir, mp[i][j].fir, 0, 0);
}
else {
add(mp[i][j].fir, t, 1, 0), add(t, mp[i][j].fir, 0, 0);
if (i>1 && !lim[i-1][j]) add(mp[i-1][j].sec, mp[i][j].fir, 1, 0), add(mp[i][j].fir, mp[i-1][j].sec, 0, 0);
if (j>1 && !lim[i][j-1]) add(mp[i][j-1].sec, mp[i][j].fir, 1, 0), add(mp[i][j].fir, mp[i][j-1].sec, 0, 0);
if (i<n && !lim[i+1][j]) add(mp[i+1][j].sec, mp[i][j].fir, 1, 0), add(mp[i][j].fir, mp[i+1][j].sec, 0, 0);
if (j<n && !lim[i][j+1]) add(mp[i][j+1].sec, mp[i][j].fir, 1, 0), add(mp[i][j].fir, mp[i][j+1].sec, 0, 0);
}
}
}
add(s1, s2, 0, 0), add(s2, s1, 0, 0);
//cout<<"pos1"<<endl;
int tem=0;
for (int i=1,it=size-1; i<=m; ++i) {
++e[it].flw;
while (spfa(s1, t)) {
tem+=dis[t];
ans=min(ans, tem);
//cout<<"ans: "<<ans<<endl;
for (int u=t; u!=s1; u=e[back[u]^1].to) {
e[back[u]].flw-=inc[t];
e[back[u]^1].flw+=inc[t];
}
}
}
printf("%d\n", sum+ans);
return 0;
}
题解 marshland的更多相关文章
- 2018HN省队集训
HNOI2018省队集训 Day 1 流水账 T1 tree 换根+求\(lca\)+求子树和,一脸bzoj3083遥远的国度的既视感.子树和讨论一下就好了,\(lca\)?也是大力讨论一波. 先写了 ...
- [2018HN省队集训D5T1] 沼泽地marshland
[2018HN省队集训D5T1] 沼泽地marshland 题意 给定一张 \(n\times n\) 的棋盘, 对于位置 \((x,y)\), 若 \(x+y\) 为奇数则可能有一个正权值. 你可以 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
随机推荐
- WPF教程二:理解WPF的布局系统和常用的Panel布局
WPF的布局系统 了解元素的测量和排列方式是理解布局的第一步.在测量(measure)阶段容器遍历所有子元素,并询问子元素它们所期望的尺寸.在排列(arrange)阶段,容器在合适的位置放置子元素.理 ...
- 按键控制LED灯-ESP32中断处理
#include <driver/gpio.h> #include <esp_task_wdt.h> #include <freertos/FreeRTOS.h> ...
- java课堂考试总结
9月22日,进行了开学第一堂的java测试,来检验暑假的自学成果.下午的考试中,时间应该是比较充分的,但是我还是有许多功能模块没有完成,功能缺少,在进行测试的时候暴露出了许多漏洞. 总结一下,在暑假的 ...
- 【Mysql】InnoDB 引擎中的页目录
一.页目录和槽 接上一篇,现在知道记录在页中按照主键大小顺序串成了单链表. 那么我使用主键查询的时候,最顺其自然的办法肯定是从第一条记录,也就是 Infrimum 记录开始,一直向后找,只要存在总会找 ...
- Markdown 样式美化大全
Markdown 样式大全 目录 Markdown 样式大全 1. 键盘 2. 路径 3. 彩色字体背景 4. 折叠 5. 锚点链接 原生锚点1 原生锚点2 Hello Hello 6. 待办列表 7 ...
- POJ4007 Flood-it! 题解
调得我快死了啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!! 先自己写了几发,老是 T,然后去看题解,大体思路居然都差不多,估计是自己写挂了orz. 几乎所有题解都有个vis数组,真 nm 看不懂到底是什么意思 ...
- SSM框架,在Html界面利用ajax,json,jQuery实现省市区下拉框联动
1.先生成省市区表格 2.建立实体类 3.在html画出下拉框 <select id="province"> <option value="" ...
- k8s系列文章第五篇(docker-compose)
更多精彩内容,猛搓这里 目录 一.Docker Compose 1.前言 2.官方介绍 1.Compose 中有两个重要的概念 2.三步骤 3.Compose是Docker官方的开源项目,需要安装! ...
- 从零开始了解kubernetes
kubernetes 已经成为容器编排领域的王者,它是基于容器的集群编排引擎,具备扩展集群.滚动升级回滚.弹性伸缩.自动治愈.服务发现等多种特性能力. 本文将带着大家快速了解 kubernetes , ...
- Samba 远程命令执行漏洞(CVE-2017-7494)
该漏洞影响Samba 3.5.0之后的所有版本,在4.6.4/4.5.10/4.4.14修复了这个漏洞 use exploit/linux/samba/is_known_pipename set rh ...