原题链接:P6094 [JSOI2015]圈地

题意简述

  • 把一块 \(n \times m\) 的地分给两个人,选择分出第 \(i\) 行第 \(j\) 列的地可以获得 \(a_{i,j}\) 的收益。

  • 要在两个人分到的地中间建墙,使得两个人分到的地完全隔离,建两个格子之间的墙需要花费一定代价。

  • 最大化总收益与总代价的差

  • \(1 \le n, m \le 200\)

  • 细节还是见原题吧QAQ

思路与解答

  • 你看它数据范围这么小肯定是个图论建模,而且大概率网络流

  • 你看这题相当于要把地分成两块,并且代价最小。

  • 那就是一个最小割嘛

  • 然后考虑怎么建图

  • 你在建图时需要保证能选或不选一块地,并且要能够“割”开两块属于不同的人的地

  • 假设两个人分别为 A 和 B,那么首先把相邻两块地之间连边,流量为建墙的花费,表示如果要“割”开这两块地就要砍掉这条边,当然要不要砍再说;注意这里无法保证你要怎么“割”,所以两块地要分别向对方连边。

  • 那么之后建一个超级源点 \(S\),把 \(S\) 和所有 A 想要的地连边,流量为这块地的收益,如果在权衡之后不选,就把这条边“割”掉;同理,把所有 B 想要的地和超级汇点 \(T\) 连边,流量也为这块地的收益。

  • 那么你在这张图中跑一遍最小割,得到的结果就是你需要付出的最小代价,这里是包括了选或者不选一块地。

  • 所以你只需要把总收益,即所有结点的收益和减去最小割即可。

  • 最后,你只需要知道最小割等于最大流,就可以愉快的切题了

Code

#include <cstdio>
#include <queue>
#include <iostream>
#include <cstring>
#define abs(x) (x<0?-x:x) using namespace std; const int MAXN = 80010;
const int INF = 0x3f3f3f3f; int n, m; inline int id(int i, int j){return (i-1)*m+j;} struct edge{
int ne, to, fl;
edge(int N=0,int T=0,int F=0):ne(N),to(T),fl(F){}
}e[MAXN*6];
int fir[MAXN], num = 1;
int s, t;
inline void adde(int a, int b, int c)
{
e[++num] = edge(fir[a], b, c);
fir[a] = num;
}
inline void join(int a, int b, int c)
{
adde(a, b, c);
adde(b, a, 0);
} int dep[MAXN], cur[MAXN];
queue<int> q;
bool bfs(int s, int t)
{
for(int i=0;i<=n*m+1;i++)
dep[i] = 0, cur[i] = fir[i];
while(!q.empty()) q.pop();
q.push(s);
dep[s] = 1;
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i=fir[u];i;i=e[i].ne)
{
int v = e[i].to;
if(dep[v] || !e[i].fl) continue;
dep[v] = dep[u] + 1;
q.push(v);
}
}
return dep[t];
}
int dfs(int u, int fln)
{
if(u == t) return fln;
int res = 0;
for(int& i=cur[u];i;i=e[i].ne)
{
int v = e[i].to;
if(!e[i].fl || dep[v] != dep[u]+1) continue;
int sum = dfs(v, min(fln, e[i].fl));
e[i].fl -= sum;
e[i^1].fl += sum;
fln -= sum;
res += sum;
if(!fln) break;
}
if(!res) dep[u] = 0;
return res;
}
inline int dinic()
{
int res = 0;
while(bfs(s, t)) res += dfs(s, INF);
return res;
} int main()
{
scanf("%d%d",&n,&m);
s = 0; t = n*m+1;
int sum = 0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int a;
scanf("%d",&a);
if(a > 0) join(s, id(i, j), a);
if(a < 0) join(id(i, j), t, -a);
sum += abs(a);
}
}
for(int i=1;i<n;i++)
{
for(int j=1;j<=m;j++)
{
int a;
scanf("%d",&a);
join(id(i, j), id(i+1, j), a);
join(id(i+1, j), id(i, j), a);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)
{
int a;
scanf("%d",&a);
join(id(i, j), id(i, j+1), a);
join(id(i, j+1), id(i, j), a);
}
}
printf("%d\n",sum-dinic());
return 0;
}

[JSOI2015]圈地的更多相关文章

  1. bzoj4485: [Jsoi2015]圈地

    思维僵化选手在线被虐 其实应该是不难的,题目明显分成两个集合,要求是不同集合的点不能联通 先假设全选了,然后二分图最小割,相邻两个点直接连墙的费用就可以了 #include<cstdio> ...

  2. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. 「JSOI2015」圈地

    「JSOI2015」圈地 传送门 显然是最小割. 首先对于所有房子,权值 \(> 0\) 的连边 \(s \to i\) ,权值 \(< 0\) 的连边 \(i \to t\) ,然后对于 ...

  5. 「JSOI2015」symmetry

    「JSOI2015」symmetry 传送门 我们先考虑构造出原正方形经过 \(4\) 种轴对称变换以及 \(2\) 种旋转变换之后的正方形都构造出来,然后对所得的 \(7\) 个正方形都跑一遍二维哈 ...

  6. QQ空间/朋友圈类界面的搭建

    类似于QQ空间的布局主要是在说说信息.点赞.回复三大部分的自适应布局上. 当我们需要搭建类似QQ空间.微信朋友圈的界面的时候,可做如下操作: 创建一个对应的model类: 创建一个对应model类的f ...

  7. Python微信-- 分享接口(分享到朋友圈、朋友、空间)

    生成JS-SDK权限验证的签名 获取signature(签名)首先要获得 1.#获得jsapi_ticket 2.#获取当前页面的url #获取当前页面的url url="{}://{}{} ...

  8. BJITJobs : 北京IT圈高端职位招聘信息,成功率最高的高端求职渠道

    你有实力,但比你差的人都升了,你的师弟都年薪50万了,你还是找不到机会.为什么你离高端机会总是差一步呢?其实你离成功就差一次机会,一个适合你的高端职位的信息! 招聘网站不靠谱:三大网站都是低端职位为主 ...

  9. WPF 自定义绕圈进度条

    在设计界面时,有时会遇到进度条,本次讲解如何设计自定义的绕圈进度条,直接上代码: 1.控件界面 <UserControl x:Class="ProgressBarControl&quo ...

  10. Apple Watch版微信来了 收发微信刷朋友圈不在话下

    昨晚果粉守了一夜的Apple Watch发布会,意料中的惊喜不少,最让人兴奋的是微信成为首批支持的应用.是的,在全球拥有4.68亿月活跃用户的微信怎么可能不第一时间入驻呢?之前我们就有聊过Apple ...

随机推荐

  1. VUE学习-表单输入绑定

    表单输入绑定 v-model 可以用 v-model 指令在表单 <input>.<textarea> 及 <select> 元素上创建双向数据绑定. v-mode ...

  2. mysql使用经验

    1.mysql建表主键,如果整数,用bigint而不用int 2.执行sql加最大执行时间 /*+ max_execution_time(60000)*/ 3.sql中避免offset过大,查询不出来

  3. 【面试题】 用vue想要拿20k,面试题要这样回答(源码版)

    总结给大家推荐一个实用面试题库  1.前端面试题库 (面试必备)            推荐:★★★★★ 地址:前端面试题库 2.前端技术导航大全      推荐:★★★★★ 地址:前端技术导航大全 ...

  4. app内嵌H5踩坑

    内嵌的H5是用的vue2版本开发的,期间有很多的坑要踩: 1.调用app返回上一个页面不触发页面的onmouted和window.onPageShow app返回上一个页面调用的方法并不会出发vue的 ...

  5. nginx热更新流程记录

    已经做过不止一次的nginx热更新了,之前都是按照别人的路子照葫芦画瓢,现在根据我在的项目单独写一个nginx热更新流程备份自用. nginx热升级流程上传新tar到/home/cp命令复制到/usr ...

  6. 在pycharm中安装虚拟环境

    1.安装python解释器 2.安装pytorch (1)查看当前虚拟环境 conda env list (2)进入自己的虚拟环境 source activate SCI(自己的虚拟环境名字) (3) ...

  7. TCP和UDP协议之间的区别与原理

    一.TCP和UDP协议之间的区别 TCP是基于连接的,而UDP是基于非连接的. TCP传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如,传输文件,发送邮件,浏览网页 ...

  8. vue3使用echarts插件并实现点击下载图表功能

    接到一个新的需求,就是用vue3制作一幅世界地图,并实现点击下载按钮将图表转变为图片下载到本地. 使用插件: html2canvasnpm安装: npm install html2canvas组件引入 ...

  9. Blockchain for Edge of Things: Applications, Opportunities, and Challenges

    物联网:物联网设备,如传感器和手机,负责从物理环境中生成或收集数据,然后通过接入点或基站传输到附近的边缘服务器(ES).具有某些资源的物联网设备(例如,智能手机和笔记本电脑)可以充当移动区块链实体进行 ...

  10. 雪花算法-Java分布式系统自增id

    1.雪花算法的用途 分布式系统中ID生成方案,比较简单的是UUID(Universally Unique Identifier,通用唯一识别码),但是其存在两个明显的弊端: 一.UUID是128位的, ...