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. Objective-C Protocols

    Objective-C allows you to define protocols, which declare the methods expected to be used for a part ...

  2. Azure powershell 获取 vmSize 可用列表的命令

    1.使用 Add-AzureAccount -Environment azurechinacloud 登录到订阅 2.选择默认的订阅 Select-AzureSubscription -Subscri ...

  3. Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析

    Volley源码解析(三) 有缓存机制的情况走缓存请求的源码分析 Volley之所以高效好用,一个在于请求重试策略,一个就在于请求结果缓存. 通过上一篇文章http://www.cnblogs.com ...

  4. jmeter分布式测试配置

    jmeter分布式测试 说明:1台8核16G的windows2008的机器,只能器6000个线程,否则效果不是很好:并且负载机器需要做如下设置: 1.打开注册表:regedit 2.HKEY_LOCA ...

  5. MySQL存储过程简介和引擎说明

  6. 解决Starting to watch source with Jekyll and Compass. Starting Rack on port 4000

    问题 Starting to watch source with Jekyll and Compass. Starting Rack on port 4000 rake aborted! Errno: ...

  7. UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)

    隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...

  8. Educational Codeforces Round 11 _D

    http://codeforces.com/contest/660/problem/D 这个题据说是很老的题了 然而我现在才知道做法 用map跑了1953ms: 题目大意 给你n个点的坐标 求这些点能 ...

  9. 模拟水题之unique两行AC

    https://icpc.njust.edu.cn/Contest/749/A/ Description 小鱼喜欢吃糖果.他有两盒糖果,两盒糖果分别仅由小写字母组成的字符串s和字符串t构成.其中'a' ...

  10. “流”的思维—Workflowy

    3.“流”的思维—Workflowy是我最喜欢的”流“的工具(WorkFlowy - Organize your brain.)我觉得,让发散性的思维更具实施性,必须分步操作,必须有先后,必须单线程. ...