lrd的题解:http://www.cnblogs.com/liu-runda/p/6695139.html

我还是太菜了。以后遇到这种题目应该分析分析性质的。

网络流复杂度真是$O(玄学)$

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define inf 0x3f3f3f3f
#define ll long long
#define mp make_pair
#define maxn 500005 int mov[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int h[maxn],to[maxn],ne[maxn],fl[maxn],en=0,n,m,k;
int S=maxn-2,T=maxn-1,dis[maxn];
queue <int> q;
map <pair<int,int>,int> Link; void add(int a,int b,int c)
{
to[en]=b;ne[en]=h[a];fl[en]=c;h[a]=en++;
to[en]=a;ne[en]=h[b];fl[en]=0;h[b]=en++;
} bool tell()
{
memset(dis,-1,sizeof dis); dis[S]=0; q.push(S);
while (!q.empty())
{
int x=q.front(); q.pop();
for (int i=h[x];i>=0;i=ne[i])
if (dis[to[i]]==-1&&fl[i]>0){
dis[to[i]]=dis[x]+1;
q.push(to[i]);
}
}
return dis[T]!=-1;
} int zeng(int k,int now)
{
if (k==T) return now;
int ret=0;
for (int i=h[k];i>=0&&ret<now;i=ne[i])
if (dis[to[i]]==dis[k]+1&&fl[i]>0)
{
int tmp=zeng(to[i],min(fl[i],now-ret));
fl[i]-=tmp;fl[i^1]+=tmp;ret+=tmp;
}
if (!ret) dis[k]=-1;
return ret;
} int dinic()
{
int ret=0,tmp;
while (tell()) while (tmp=zeng(S,inf)) ret+=tmp;
return ret;
} int x[maxn],y[maxn],w[maxn]; bool isgreen(int x,int y)
{
int tmp=(x>>1)&1;
if (tmp) return ((x+y)&1);
else return (!((x+y)&1));
} bool isblue(int x,int y)
{if ((!isgreen(x,y))&&(!((x>>1)&1))) return true;return false;} bool isred(int x,int y)
{if ((!isgreen(x,y))&&(!isblue(x,y))) return true;return false;} bool leftgreen(int x,int y)
{return (isgreen(x,y))&&(isred(x,y+1))&&(isgreen(x+1,y));} bool rightgreen(int x,int y)
{return (isgreen(x,y))&&(isred(x,y+1))&&(isgreen(x-1,y));} void Finout()
{
freopen("block.in","r",stdin);
freopen("block.out","w",stdout);
} int main()
{
memset(h,-1,sizeof h);
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
F(i,1,k)
{
scanf("%d%d%d",&x[i],&y[i],&w[i]);
if (isred(x[i],y[i])) add(S,i,w[i]);
else if (isblue(x[i],y[i])) add(i,T,w[i]);
Link[mp(x[i],y[i])]=i;
}
F(i,1,k)
{
if (isblue(x[i],y[i]))
{
F(k,0,3)
{
int tx=x[i]+mov[k][0],tmp,ty=y[i]+mov[k][1];
if (tx>=1&&tx<=n&&ty>=1&&ty<=m&&isgreen(tx,ty)&&(tmp=Link[mp(tx,ty)]))
add(tmp,i,inf);
}
}
else if (isred(x[i],y[i]))
{
F(k,0,3)
{
int tx=x[i]+mov[k][0],tmp,ty=y[i]+mov[k][1];
if (tx>=1&&tx<=n&&ty>=1&&ty<=m&&isgreen(tx,ty)&&(tmp=Link[mp(tx,ty)]))
add(i,tmp,inf);
}
}
else if (leftgreen(x[i],y[i]))
{
int tmp;
if ((tmp=Link[mp(x[i]+1,y[i])]))
add(i,Link[mp(x[i]+1,y[i])],min(w[i],w[tmp]));
}
else if (rightgreen(x[i],y[i]))
{
int tmp;
if ((tmp=Link[mp(x[i]-1,y[i])]))
add(i,Link[mp(x[i]-1,y[i])],min(w[i],w[tmp]));
}
}
printf("%d\n",dinic());
}

  

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

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 一个不合法方案其实就是蓝线的两边格子一定选.剩下两部分四相邻格子里各选一个. 所以这个 ...

  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. uvm_reg_defines——寄存器模型(四)

    文件: src/marcos/uvm_reg_defines 类: 无 该文件是寄存器模型src/reg/* 文件对于的宏文件,主要定义了寄存器地址位宽,寄存器数据位宽,字节的大小.计算机从最初的8, ...

  2. C# 一维数组 二位数组 多维数组

    什么是数组? 数组是一组变量,就是把一些变量串在一起,放在一块. 数组的作用? 假设有一堆变量,每个变量都有一些程序,那么这堆程序放在一起  程序就会混乱,处理起来有些麻烦,那么数组就是把这些变量放在 ...

  3. POJ 2955 Brackets (区间DP,常规)

    题意: 给出一个字符串,其中仅仅含 “ ( ) [ ] ” 这4钟符号,问最长的合法符号序列有多长?(必须合法的配对,不能混搭) 思路: 区间DP的常规问题吧,还是枚举区间[i->j]再枚举其中 ...

  4. Mysql的Root密码忘记,查看或修改的解决方法

    Mysql的Root密码忘记,查看或修改的解决方法:1.首先启动命令行2.在命令行运行:taskkill /f /im mysqld-nt.exe3.继续在命令行运行:mysqld-nt --skip ...

  5. 如何诊断 11.2 集群节点驱逐问题 (文档 ID 1674872.1)

    适用于: Oracle Database - Enterprise Edition - 版本 11.2.0.1 到 11.2.0.2 [发行版 11.2]本文档所含信息适用于所有平台 用途 这篇文档提 ...

  6. 更新Svn客户端后,右键菜单中没有TortoiseSVN

    环境: OS:                 Windows XP sp3 升级后SVNServer:    VisualSVN Server 2.7.3 升级后SVNClient:    小乌龟: ...

  7. 强化学习_Deep Q Learning(DQN)_代码解析

    Deep Q Learning 使用gym的CartPole作为环境,使用QDN解决离散动作空间的问题. 一.导入需要的包和定义超参数 import tensorflow as tf import n ...

  8. 技术大众化--10款无需编程的App DIY开发工具

    你有一个很棒的创意但不会编程怎么办?外包.合伙开发还是从零学编程?这里提供另外一种方式--使用无需编程的App DIY开发工具.DIY开发工具不仅节省了开发时间和资金,更为那些创意无限热爱应用的人提供 ...

  9. jpeg和jpg的区别是什么

    JPG是JPEG的简写,jpg是后缀名,jpeg既可作为后缀名,又能代表文件格式:JPG——JPEG文件格式. 我们在系统自带的画图程序里保存文件,在保存类型:JPEG(*.JPG,*.JPEG,*. ...

  10. velocity生成静态页面代码

    首先需要必备的jar包: web.xml <!-- load velocity property --> <servlet> <servlet-name>veloc ...