题目: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. 关于Redis命令keys在性能方面的说明

    redis的keys命令类似于Mysql的like命令,无非就是模糊匹配相近的字符数据. KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 k ...

  2. 如何写一个自己的渣渣PHP框架

    原文链接:https://www.opqnext.com/2017/01/18/%E5%A6%82%E4%BD%95%E5%86%99%E4%B8%80%E4%B8%AA%E8%87%AA%E5%B7 ...

  3. [kata]数值内3和5的倍数的总和求解

    这个题是这样的,方法参数接受一个数值,以3,5为基数,返回小于这个参数的3,5的倍数,加上3,5本身总和. 朋友段帅说头疼,估计是天气原因吧,好起来吧,还得战斗呢.

  4. MyBatis使用小案例

    首先回顾一下MyBatis封装简化Dao层连接数据库操作的顺序. 首先MyBatis是一个引入的jar包,还有一些依赖包,可能用不到的jar包,一并引入就好了,再多引入一个Juntil.jar测试包( ...

  5. node scripts/install.js 停顿解决办法

    参考:node-sass 安装卡在 node scripts/install.js 解决办法 在安装hexo的时候,运行: npm install hexo-cli -g 卡死在了 node scri ...

  6. POJ 1122 FDNY to the Rescue!(最短路+路径输出)

    http://poj.org/problem?id=1122 题意:给出地图并且给出终点和多个起点,输出从各个起点到终点的路径和时间. 思路: 因为有多个起点,所以这里反向建图,这样就相当于把终点变成 ...

  7. hdu 3792 Twin Prime Conjecture 前缀和+欧拉打表

    Twin Prime Conjecture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. python 字符串的反转

    def string_reverse(str1): rstr1 = '' index = len(str1) : rstr1 += str1[ index - ] index = index - re ...

  9. 人工神经网络 Artificial Neural Network

    2017-12-18 23:42:33 一.什么是深度学习 深度学习(deep neural network)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高 ...

  10. How To Use Amazon MWS To Download Unshipped Order Reports

    文章来源:http://www.samswiches.com/2011/02/how-to-use-amazon-mws-to-download-unshipped-order-reports/ ac ...