题面太长了请各位自行品尝—>老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的方块 染色+最小割的更多相关文章

  1. BZOJ 4823 Luogu P3756 [CQOI2017]老C的方块 (网络流、最小割)

    题目链接 (Luogu) https://www.luogu.org/problem/P3756 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id= ...

  2. BZOJ4823 [Cqoi2017]老C的方块 【最小割】

    题目 老C是个程序员. 作为一个懒惰的程序员,老C经常在电脑上玩方块游戏消磨时间.游戏被限定在一个由小方格排成的R行C列网格上,如果两个小方格有公共的边,就称它们是相邻的,而且有些相邻的小方格之间的公 ...

  3. BZOJ4823 CQOI2017老C的方块(最小割)

    如果将其转化为一个更一般的问题即二分图带权最小单边点覆盖(最小控制集)感觉是非常npc的.考虑原题给的一大堆东西究竟有什么奇怪的性质. 容易发现如果与特殊边相邻的两格子都放了方块,并且这两个格子都各有 ...

  4. 【洛谷P3756】[CQOI2017]老C的方块(最小割)

    洛谷 题意: 给出一个网格图类似于这样: 现在给出一个\(n*m\)大小的网格,之后会给出一些点,若某些点相连形成了如下的几个图案,那么就是不好的. 现在可以删去一些点,但删除每个点都有一些代价,问最 ...

  5. bzoj 4823 & 洛谷 P3756 老C的方块 —— 最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 https://www.luogu.org/problemnew/show/P3756 ...

  6. Luogu SP839 OPTM - Optimal Marks(按位最小割)

    这道题和 BZOJ 2400 是一道题,不多讲了 CODE #include <cstdio> #include <cstring> #include <vector&g ...

  7. bzoj 1412 [ZJOI2009]狼和羊的故事(最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1412 [题意] 在一个n*m的格子中,将羊和狼隔开的最小代价. [思路] 最小割. 由 ...

  8. bzoj千题计划322:bzoj2561: 最小生成树(最小割)

    https://www.lydsy.com/JudgeOnline/problem.php?id=2561 考虑Kruscal算法求最小生成树的流程 如果 u和v之间的长为L的边能出现在最小生成树里, ...

  9. bzoj 1001 平面图转对偶图 最短路求图最小割

    原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1001 整理了下之前A的题 平面图可以转化成对偶图,然后(NlogN)的可以求出图的最小割( ...

随机推荐

  1. MD5加密 和Sha256加密

    //MD5加密 private static string GetMd5Hash(string emailAddress) { byte[] data = MD5.Create().ComputeHa ...

  2. PHP编程常见小错误错误

    使用PHP的过程中经常因为粗心出一些简单的错误,先将自己遇到几个的记录下来,以后慢慢增加. 1 Fatal error: Function name must be a string 翻译很简单,就是 ...

  3. MYSQL自动备份策略的选择(转载)

    原文地址: http://shinepaopao.iteye.com/blog/1938568

  4. RelativeLayout和layout_weight的异曲同工之妙(转载)

    转自:http://ericbaner.iteye.com/blog/1161751 Android应用UI开发,对以上布局,可以使用RelativeLayout, 即: Xml代码 <Rela ...

  5. bootstrap table 分页后,重新搜索的问题

    前提: 自定义搜索且有分页功能,比如搜索产品名的功能. 现象:当搜索充气娃娃的时候返回100条记录,翻到第五页.  这时候搜索按摩棒,数据有200条,结果应该是第一页的记录,但是实际显示的还是第五页的 ...

  6. 【WIP】Ruby JSON

    创建: 2018/03/22 以后有空补上 注: JSON.generate 参数只能是Obejct或者Array, 不可以是Hash https://docs.ruby-lang.org/ja/la ...

  7. 【笔记】对自定义异常的理解(Java)

    原本,原有的异常是非手动地.自动地抛出的. 了解自定义异常时,发现其信息只是: 继承了谁,即它自己算哪种异常: 它的信息,比如一个ID,这个貌似还是可选的: 它是可被传入信息的 没有遗漏的话,就这仨了 ...

  8. C plus plus sprintf用法

    sprintf int sprintf ( char * str, const char * format, ... ); Write formatted data to string Compose ...

  9. lavas安装

    最近在研究pwa,百度基于此写了一套开源框架lavas,学习下: 1.环境准备: lavas 安装.git安装 Node.js:https://nodejs.org/ Git:https://git- ...

  10. 用jquery的.val() 给具有style="display:none;" 属性的标签写值的问题。

    今天写项目, 碰到奇怪现象, 用jquery的val()函数怎么都无法给标签赋值,而我确定是否赋值是通过浏览器控制台来看的.其实这种方式不准确,因为具有 style="display:non ...