BZOJ 4823 Luogu P3756 老C的方块 染色+最小割
题面太长了请各位自行品尝—>老C的方块
分析:
我们要解决掉所有使人弃疗的组合,还要保证花费最小,容易想到最小割(当然你要是想费用流的话,我们就没办法定义流量了)
我们来分析一下那些令人弃疗的组合,他们的规律:
首先是两个和特殊边直接相邻的方块(以下简称轴方块),加上两侧各任意一个边缘方块,组成了令人弃疗的组合。
所以我们有三种选择(准确地说其实只有两种,前两种本质一样):
1. 将和特殊边左侧的轴方块相连的所有边缘方块都破坏掉。
2. 将和特殊边右侧的轴方块相连的所有边缘方块都破坏掉。
3. 破坏掉任意一个轴方块。
我们还可以发现,特殊边两侧的部分相互独立。
所以我们可以应用染色技巧,怎么染色?当然是按照坐标(i+j)的奇偶性将图染成两种颜色。
之后从对于边缘方块及其轴方块,白点向黑点连边,流量为inf、
相邻的轴方块,黑点向白点连边,容量为较小的那个的代价、
之后S向白色边缘方块连边,容量为其代价,黑边缘方块向T连边,容量为其代价。
跑最小割。
细节很多,一着不慎满盘皆输!
代码:
#include<bits/stdc++.h>
#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;int tot=;
const int N=,inf=0x3f3f3f3f;
int S,T,n,m,k,h[N],c=,q[N],d[N];
struct node{int y,z,nxt;}e[N*];
struct kuai{int x,y,w,id;}p[N];
void add(int x,int y,int z){
e[++c]=(node){y,z,h[x]};h[x]=c;
e[++c]=(node){x,,h[y]};h[y]=c;
} bool bfs(){
int f=,t=;ms(d,-);
q[++t]=S;d[S]=;
while(f<=t){
int x=q[f++];
for(int i=h[x],y;i;i=e[i].nxt)
if(d[y=e[i].y]==-&&e[i].z)
d[y]=d[x]+,q[++t]=y;
} return (d[T]!=-);
} int dfs(int x,int f){
if(x==T) return f;int w,tmp=;
for(int i=h[x],y;i;i=e[i].nxt)
if(d[y=e[i].y]==d[x]+&&e[i].z){
w=dfs(y,min(e[i].z,f-tmp));
if(!w) d[y]=-;e[i].z-=w;
e[i^].z+=w;tmp+=w;
if(tmp==f) return f;
} return tmp;
} void dinic(){
while(bfs()) tot+=dfs(S,inf);
} bool cpx(kuai a,kuai b){
return a.x!=b.x?a.x<b.x:a.y<b.y;
} bool cpy(kuai a,kuai b){
return a.y!=b.y?a.y<b.y:a.x<b.x;
} int main(){
scanf("%d%d%d",&n,&m,&k);S=;T=k+;
for(int i=;i<=k;p[i].id=i,i++)
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].w);
p[].x=p[].y=p[k+].x=p[k+].y=;
sort(p+,p+k+,cpx);
for(int i=;i<=k;i++)
if(p[i+].x==p[i].x&&p[i+].y==p[i].y+){
if(((p[i].x+p[i].y)&)==)
add(p[i].id,p[i+].id,inf);
else add(p[i+].id,p[i].id,inf);
} sort(p+,p+k+,cpy);
for(int i=,val;i<=k;i++){
if(p[i+].x!=p[i].x+||p[i+].y!=p[i].y)
continue;
if(p[i].x%&&p[i].y%==((p[i].x-)/)%)
continue;
if(p[i].x%) val=min(p[i].w,p[i+].w);
else val=inf;if(p[i].y%)
add(p[i+].id,p[i].id,val);
else add(p[i].id,p[i+].id,val);
} for(int i=;i<=k;i++)
if(((p[i].x-)/)%==p[i].y%){
if((p[i].x+p[i].y)%==)
add(S,p[i].id,p[i].w);
else add(p[i].id,T,p[i].w);
} dinic();
printf("%d\n",tot);return ;
}
染色最小割
BZOJ 4823 Luogu P3756 老C的方块 染色+最小割的更多相关文章
- BZOJ 4823 Luogu P3756 [CQOI2017]老C的方块 (网络流、最小割)
题目链接 (Luogu) https://www.luogu.org/problem/P3756 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id= ...
- BZOJ4823 [Cqoi2017]老C的方块 【最小割】
题目 老C是个程序员. 作为一个懒惰的程序员,老C经常在电脑上玩方块游戏消磨时间.游戏被限定在一个由小方格排成的R行C列网格上,如果两个小方格有公共的边,就称它们是相邻的,而且有些相邻的小方格之间的公 ...
- BZOJ4823 CQOI2017老C的方块(最小割)
如果将其转化为一个更一般的问题即二分图带权最小单边点覆盖(最小控制集)感觉是非常npc的.考虑原题给的一大堆东西究竟有什么奇怪的性质. 容易发现如果与特殊边相邻的两格子都放了方块,并且这两个格子都各有 ...
- 【洛谷P3756】[CQOI2017]老C的方块(最小割)
洛谷 题意: 给出一个网格图类似于这样: 现在给出一个\(n*m\)大小的网格,之后会给出一些点,若某些点相连形成了如下的几个图案,那么就是不好的. 现在可以删去一些点,但删除每个点都有一些代价,问最 ...
- bzoj 4823 & 洛谷 P3756 老C的方块 —— 最小割
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 https://www.luogu.org/problemnew/show/P3756 ...
- Luogu SP839 OPTM - Optimal Marks(按位最小割)
这道题和 BZOJ 2400 是一道题,不多讲了 CODE #include <cstdio> #include <cstring> #include <vector&g ...
- bzoj 1412 [ZJOI2009]狼和羊的故事(最小割)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1412 [题意] 在一个n*m的格子中,将羊和狼隔开的最小代价. [思路] 最小割. 由 ...
- bzoj千题计划322:bzoj2561: 最小生成树(最小割)
https://www.lydsy.com/JudgeOnline/problem.php?id=2561 考虑Kruscal算法求最小生成树的流程 如果 u和v之间的长为L的边能出现在最小生成树里, ...
- bzoj 1001 平面图转对偶图 最短路求图最小割
原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1001 整理了下之前A的题 平面图可以转化成对偶图,然后(NlogN)的可以求出图的最小割( ...
随机推荐
- 【原创】CentOS 6.5 中安装 Mysql 5.6,并远程连接Mysql
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.在安装CentOS时,若选择的是Basic Server(可支持J2EE开发),则新安装好的CentOS系统中默认是已经安装了一个mysq ...
- Sgu294He's Circles
Description 有一个长度为N的环,上面写着'X'和'E',问本质不同的环有多少种.(N不超过200000). Input The input file contains a single i ...
- [Usaco2005 Jan]Muddy Fields泥泞的牧场
Description 雨连续不断的击打了放牛的牧场,一个R行C列的格子(1<=R<=50,1<=C<=50).虽然这对草来说是件好事,但这却使得一些没有草遮盖的土地变得很泥泞 ...
- matlab学习路线
知乎:matlab学习路线 MATLAB数学教学视频
- Navicat无法连接Oracle数据库问题处理一例
需要通过Navicat连接Oracle数据库进行数据迁移,发现无法连接,报如下错误信息: 按照百度中的说明配置了正确的oci. 此时又报如下错误: 问题解决: 经测试发现与软件的版本有关系,本机的Or ...
- AngularJs调用NET MVC 控制器中的函数进行后台操作
题目中提到的控制器指的是.NET MVC的控制器,不是angularjs的控制器. 首先看主页面的代码: <!DOCTYPE html> <html> <head> ...
- 230 Kth Smallest Element in a BST 二叉搜索树中第K小的元素
给定一个二叉搜索树,编写一个函数kthSmallest来查找其中第k个最小的元素. 注意:你可以假设k总是有效的,1≤ k ≤二叉搜索树元素个数. 进阶:如果经常修改二叉搜索树(插入/删除操作)并且你 ...
- 转】MYSQL性能调优与架构设计之select count(*)的思考
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/5/ 感谢! Posted: Feb 7, 2013 Tag ...
- Windowsforms 中对文件操作
文件及文件夹操作: 引用命名空间:using system .IO; 1.File类: 创建:File.Create(路径);——返回FileStream FileStream fs = File.C ...
- Java实现求二叉树的路径和
题: 解: 这道题考的是如何找出一个二叉树里所有的序列. 我的思路是先从根节点开始遍历,找出所有的子节点,因为每个子节点只有一个父节点,再根据每个子节点向上遍历找出所有的序列,再判断序列的总和. 这样 ...