题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823

一个不合法方案其实就是蓝线的两边格子一定选、剩下两部分四相邻格子里各选一个。

所以这个图是一个四分图。记蓝线左边格子是1,右边是2,与 1 四相邻的是3,与 2 四相邻的是4;这个部分右边就是蓝线左边是2、右边是1,这样。

有一些“4个格子不能同时选”的限制,考虑怎么在图中表示。

需要做到的是4个格子里割掉一个就能让这条路径废掉,那么应该是把有联系的4个点连成一条链。因为是4分图,所以能做到。

一个格子可能在很多路径里,如果在路径的边上放权值,不能表示割掉这个格子可以使很多路径都废掉。所以把格子拆成两个点,自己向自己连的边上放权值即可。

map 是一个有序结构,所以结构体的话要定义小于号。如果只定义了 x<b.x ,那么在 x==b.x 的时候 map 会认为这是同一个点!即使它们的 y 不同。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int N=2e5+,M=2e6+,INF=1e9+;
int n,r,c,t,x[N],y[N],w[N];
int hd[N],xnt=,cur[N],to[M],nxt[M],cap[M];
int dfn[N],q[N],he,tl;
struct Node{
int x,y;
Node(int a=,int b=):x(a),y(b) {}
bool operator< (const Node &b)const
{return x==b.x?y<b.y:x<b.x;}//////x<b.x will rec x==b.x as the same point
};
map<Node,int> mp;
int Mn(int a,int b){return a<b?a:b;}
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
void add(int x,int y,int z)
{
to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;cap[xnt]=z;
to[++xnt]=x;nxt[xnt]=hd[y];hd[y]=xnt;cap[xnt]=;
}
bool bfs()
{
memset(dfn,,sizeof dfn);dfn[]=;
q[he=tl=]=;
while(he<=tl)
{
int k=q[he++];
for(int i=hd[k],v;i;i=nxt[i])
if(cap[i]&&!dfn[v=to[i]])
dfn[v]=dfn[k]+,q[++tl]=v;
}
return dfn[t];
}
int dinic(int cr,int flow)
{
if(cr==t)return flow;
int use=;
for(int& i=cur[cr],v;i;i=nxt[i])
if(cap[i]&&dfn[v=to[i]]==dfn[cr]+)
{
int tmp=dinic(v,Mn(flow-use,cap[i]));
if(!tmp)dfn[v]=;
use+=tmp;cap[i]-=tmp;cap[i^]+=tmp;
if(use==flow)return use;
}
return use;
}
int main()
{
c=rdn();r=rdn();n=rdn();
for(int i=;i<=n;i++)
{
y[i]=rdn();x[i]=rdn();w[i]=rdn();//y[] then x[]
mp[Node(x[i],y[i])]=i;
}
t=(n<<)+; Node o;
for(int i=;i<=n;i++)
{
add(i,i+n,w[i]);
int u=(x[i]&),v=(y[i]&);
if((u&&!v)||(!u&&v==))add(,i,INF);//
else if((u&&v==)||(!u&&v==))add(i+n,t,INF);//
else if((u&&v==)||(!u&&!v))//
{
if(mp.count(o=Node(x[i]-,y[i])))//3->1
add(mp[o]+n,i,INF);
if(mp.count(o=Node(x[i]+,y[i])))
add(mp[o]+n,i,INF);
if(mp.count(o=Node(x[i],y[i]+)))//1>2 or 3>1
u?add(i+n,mp[o],INF):add(mp[o]+n,i,INF);
if(mp.count(o=Node(x[i],y[i]-)))
u?add(mp[o]+n,i,INF):add(i+n,mp[o],INF);
}
else//
{
if(mp.count(o=Node(x[i]-,y[i])))
add(i+n,mp[o],INF);
if(mp.count(o=Node(x[i]+,y[i])))
add(i+n,mp[o],INF);
if(mp.count(o=Node(x[i],u?y[i]+:y[i]-)))
add(i+n,mp[o],INF);
}
}
int ans=;
while(bfs())memcpy(cur,hd,sizeof hd),ans+=dinic(,INF);
printf("%d\n",ans);
return ;
}

bzoj 4823 [Cqoi2017]老C的方块——网络流的更多相关文章

  1. BZOJ 4823 [Cqoi2017]老C的方块 ——网络流

    lrd的题解:http://www.cnblogs.com/liu-runda/p/6695139.html 我还是太菜了.以后遇到这种题目应该分析分析性质的. 网络流复杂度真是$O(玄学)$ #in ...

  2. bzoj 4823: [Cqoi2017]老C的方块 [最小割]

    4823: [Cqoi2017]老C的方块 题意: 鬼畜方块游戏不解释... 有些特殊边,有些四个方块组成的图形,方块有代价,删掉一些方块使得没有图形,最小化代价. 比较明显的最小割,一个图形中必须删 ...

  3. BZOJ 4823: [Cqoi2017]老C的方块

    分析: 我觉得我的网络流白学了...QAQ... 其实数据范围本是无法用网络流跑过去的,然而出题者想让他跑过去,也就跑过去了... 看到题目其实感觉很麻烦,不知道从哪里入手,那么仔细观察所给出的有用信 ...

  4. bzoj 4823: [Cqoi2017]老C的方块【最大权闭合子图】

    参考:https://www.cnblogs.com/neighthorn/p/6705785.html 并不是黑白染色而是三色染色(还有四色的,不过是一个意思 仔细观察一下不合法情况,可以发现都是特 ...

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

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

  6. [CQOI2017]老C的方块 网络流

    ---题面--- 题解: 做这题做了好久,,,换了4种建图QAQ 首先我们观察弃疗的形状,可以发现有一个特点,那就是都以一个固定不变的特殊边为中心的,如果我们将特殊边两边的方块分别称为s块和t块, 那 ...

  7. 洛谷$P3756\ [CQOI2017]$老$C$的方块 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 看到不能出现给定的讨厌的图形,简单来说就,特殊边两侧的方格不能同时再连方格. 所以如果出现,就相当于是四种方案?就分别炸四个格子. 然后冷静分析一波之后发现 ...

  8. bzoj4823: [Cqoi2017]老C的方块(最小割)

    4823: [Cqoi2017]老C的方块 题目:传送门 题解: 毒瘤题ORZ.... 太菜了看出来是最小割啥边都不会建...狂%大佬强强强   黑白染色?不!是四个色一起染,四层图跑最小割... 很 ...

  9. 【BZOJ4823】[CQOI2017]老C的方块(网络流)

    [BZOJ4823][CQOI2017]老C的方块(网络流) 题面 BZOJ 题解 首先还是给棋盘进行黑白染色,然后对于特殊边左右两侧的格子单独拎出来考虑. 为了和其他格子区分,我们把两侧的这两个格子 ...

随机推荐

  1. ESXi主机遗忘密码重置密码

    ESXi版本:6.0.0 VMware-VMvisor-Installer-6.0.0.update02-3620759.x86_64-Dell_Customized-A00.iso 使用和服务器系统 ...

  2. C++ 中的关于输出的设置于

    ▲setw(n)用法: 通俗地讲就是预设宽度 如 cout<<setw(5)<<255<<endl; 结果是: (空格)(空格)255 ▲setfill(char ...

  3. 学习gulpfile.babel.js随笔

    'use strict' import gulp from 'gulp' //将gulp插件包含进来 import sass from 'gulp-sass' //编译sass文件 import im ...

  4. 【Python】解决测试依赖之 Mock模块的基本使用

    什么是mock? Mock,顾名思义,模拟,在我们日常生活中或者影视作品中见得最多的可能就是预备飞行员的模拟训练,印象比较深的是电影<萨利机长>中的模拟器,经过几千次模拟,人们得出机长萨利 ...

  5. MVVM特点、源(数据)与目标(如:控件等)的映射

    数据(源,viewMode表示)与控件(目标)的完全映射, 在绑定之后,通过操作数据,改变控件显示效果.显示内容.状态等.

  6. Java网络编程和NIO详解6:Linux epoll实现原理详解

    Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO h ...

  7. HttpResponse 类

    而封闭HTTP输出信息的类型就是HttpResponse类,使用HttpResponse类可以实现三种类型的输出,即文本,URL,二进制流.  实现这三类的属性和方法分别介绍如下:1.文本的输出,在日 ...

  8. laravel中数据库迁移的使用:

    创建数据库迁移文件: php artisan make:migration create_links_table 创建完表之后,设置字段: public function up() { Schema: ...

  9. 函数响应式编程RxJava

    RxJava 到底是什么 一个词:异步. RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event- ...

  10. ces

    1. 测试目录 1.1. 测试目录 2. 测试目录2 2.1 测试目录