来自FallDream的博客,未经允许,请勿转载,谢谢。


挺有意思的一道题....

看完题面比较明确是最小割,考虑怎么建图 想了比较久

突破口应该是题目中那张奇怪的图

观察这个奇怪的图和方块,很容易发现每个图案,其实都是每个分割线周围各一个1*2的块拼在一起的

假如中间有个分割线,那么就是这样,两边分别三选一

然后可以依此根据块的位置不同建出图,我大概画了一部分,大家可以参考

这张图中行从下到上,列从左到右

然后注意把点拆成入点和出点,中间连费用的边 最小割即可。

可以哈希来查点

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#define S 0
#define MN 100000
#define INF 2000000000
#define ll long long
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} map<ll,int> mp;
struct edge{int to,next,w;}e[];
int n,m,c,T,head[MN*+],C[MN*+],q[MN*+],top=,d[MN*+],cnt=,ans=;
struct Block{int x,y,w;}b[MN+];
inline void ins(int f,int t,int w)
{
if(!t) return;
e[++cnt]=(edge){t,head[f],w};head[f]=cnt;
e[++cnt]=(edge){f,head[t],};head[t]=cnt;
}
inline int num(int x,int y)
{
if(x>n||y>m||x<||y<) return ;
int res=mp[1LL*x*MN+y];
return res?res+c:;
} int dfs(int x,int f)
{
if(x==T) return f;
int used=;
for(int&i=C[x];i;i=e[i].next)
if(e[i].w&&d[e[i].to]==d[x]+)
{
int w=dfs(e[i].to,min(f-used,e[i].w));
used+=w;e[i].w-=w;e[i^].w+=w;
if(used==f) return f;
}
return d[x]=-,used;
} bool bfs()
{
memset(d,,sizeof(int)*(T+));int i,j;
for(d[q[top=i=]=S]=;i<=top;++i)
for(int j=C[q[i]]=head[q[i]];j;j=e[j].next)
if(e[j].w&&!d[e[j].to])
d[q[++top]=e[j].to]=d[q[i]]+;
return d[T];
} int main()
{
m=read();n=read();c=read();T=c*+;
for(int i=;i<=c;++i) b[i].y=read(),b[i].x=read(),b[i].w=read(),mp[1LL*b[i].x*MN+b[i].y]=i;
for(int i=;i<=c;++i)
{
ins(i+c,i,b[i].w);
if(b[i].x&)
{
int cas=b[i].y%;
if(cas==)
{
ins(S,i+c,INF);
ins(i,num(b[i].x+,b[i].y),INF);
ins(i,num(b[i].x-,b[i].y),INF);
ins(i,num(b[i].x,b[i].y+),INF);
}
if(cas==) ins(i,num(b[i].x,b[i].y+),INF);
if(cas==)
{
ins(i,num(b[i].x+,b[i].y),INF);
ins(i,num(b[i].x-,b[i].y),INF);
ins(i,num(b[i].x,b[i].y+),INF);
}
if(cas==) ins(i,T,INF);
}
else
{
int cas=b[i].y%;
if(cas==) ins(i,num(b[i].x,b[i].y-),INF);
if(cas==)
{
ins(S,i+c,INF);
ins(i,num(b[i].x,b[i].y-),INF);
ins(i,num(b[i].x+,b[i].y),INF);
ins(i,num(b[i].x-,b[i].y),INF);
}
if(cas==) ins(i,T,INF);
if(cas==)
{
ins(i,num(b[i].x,b[i].y-),INF);
ins(i,num(b[i].x-,b[i].y),INF);
ins(i,num(b[i].x+,b[i].y),INF);
}
}
}
while(bfs()) ans+=dfs(S,INF);
printf("%d\n",ans);
return ;
}

[bzoj4823][Cqoi2017]老C的方块的更多相关文章

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

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

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

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

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

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

  4. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

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

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

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

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

  7. [bzoj4823][洛谷P3756][Cqoi2017]老C的方块

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

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

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

  9. 【题解】CQOI2017老C的方块

    网络流真的是一种神奇的算法.在一张图上面求感觉高度自动化的方案一般而言好像都是网络流的主阵地.讲真一开始看到这道题也有点懵,题面很长,感觉很难的样子.不过,仔细阅读了题意之后明白了:我们所要做的就是要 ...

随机推荐

  1. PHP环境手动搭建wamp-----Apache+MySQL+PHP

    首先下载分别下载Apache+MySQL+PHP. 然后分别解压到文件夹中. 1.安装Apache 1)检查80端口是否占用 说明:apache软件占用80软件,在计算机中一个端口只能被一个软件占用 ...

  2. Ubuntu 17.10.1安装, 定制

    p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 2018.4.7 Ubuntu 17.10.1安装, 定制, 后续搭建LAMP环境 ...

  3. ORA-12514:TNS:lisntener does not currently know of service requested in connect descriptor

    在使用工具连接oracle库的时候出现了异常 根据理解初步估计是服务或者监听器没有启动 于是链接到数据库服务器进行查看  服务都已经开启,重启后链接依旧出现上述问题 使用lsnrctl status  ...

  4. GIT入门笔记(6)- 向版本库添加文本文件

    1.把文本文件添加到版本库? 所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外. 版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词&q ...

  5. YML(2)yml 语法

    YAML 语法 来源:yaml 这个页面提供一个正确的 YAML 语法的基本概述, 它被用来描述一个 playbooks(我们的配置管理语言). 我们使用 YAML 是因为它像 XML 或 JSON ...

  6. jenkins创建multibranch pipeline

    参考以下文章进行实践: https://jenkins.io/doc/pipeline/tour/hello-world/#what-is-a-jenkins-pipeline (看见一个介绍的还不错 ...

  7. 如何在命令行中让python2和python3同存

    初学python,你可能同时安装了python2和3.在我们安装好python之后,我们会面临这样一个问题,在命令行输入"python",可能会出错,或者只能调用其中一个版本,py ...

  8. HRBUST1522【单调队列+DP】

    题目:输入一个长度为n的整数序列(A1,A2,--,An),从中找出一段连续的长度不超过m的子序列,使得这个子序列的和最大. #include<stdio.h> #include<s ...

  9. nginx反向代理二级域名注意事项

    摘要 本文介绍了利用nginx实现多域名和多站点的绑定的方法及相关注意事项.您也可以只看本文的标题或红色标注部分.☺ 1.应用场景 我们经常会遇到在同一台服务器建立多个Web站点的情况,普遍的做法是为 ...

  10. SqlServer优化:当数据量查询不是特别多,但数据库服务器的CPU资源一直100%时,如何优化?

    最近和同事处理一个小程序,数据量不是特别大,某表的的数据记录:7000W条记录左右,但是从改别执行一次查询时,却发现查询速度也不快,而且最明显的问题就是CPU100%. sql语句: select g ...