4823: [Cqoi2017]老C的方块

题目:传送门


题解:

   毒瘤题ORZ....

   太菜了看出来是最小割啥边都不会建...狂%大佬强强强

   

    黑白染色?不!是四个色一起染,四层图跑最小割。。。

   很惊奇的发现染完色之后只要是不喜欢的图形都一定可以由黄-->黑-->红-->绿 组成

   那就很nice啦...兴高采烈的去敲代码...结果10^5*10^5???搞毛线...太弱了ORZ,又看了一波大佬的操作,用map存!

   woc...不谈了不谈了...撸撸撸(分情况分到想屎...虽然不多)

   注意一下...黑到红连边的时候是不可以连inf的...然而我傻逼逼的打了...改成min(w[黑],w[红])...


代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<map>
#define inf 999999999
#define qread(x) x=read()
using namespace std;
typedef long long LL;
inline LL read()
{
LL x=,f=;char ch;
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return f*x;
}
struct node
{
int x,y,c,next,other;
}a[];int len,last[];
int n,m,T,st,ed;
void ins(int x,int y,int c)
{
int k1,k2;
k1=++len;
a[len].x=x;a[len].y=y;a[len].c=c;
a[len].next=last[x];last[x]=len; k2=++len;
a[len].x=y;a[len].y=x;a[len].c=;
a[len].next=last[y];last[y]=len; a[k1].other=k2;
a[k2].other=k1;
}
int head,tail;
int list[],h[];
bool bt_h()
{
memset(h,,sizeof(h));h[st]=;
list[]=st;head=;tail=;
while(head!=tail)
{
int x=list[head];
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(!h[y] && a[k].c)
{
h[y]=h[x]+;
list[tail++]=y;
}
}
head++;
}
if(h[ed])return true;
return false;
}
int find_flow(int x,int flow)
{
int s=,t;
if(x==ed)return flow;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(h[y]==h[x]+ && a[k].c && s<flow)
{
s+=t=find_flow(y,min(a[k].c,flow-s));
a[k].c-=t;a[a[k].other].c+=t;
}
}
if(!s)h[x]=;
return s;
}
int x[],y[],w[];//第x列,第y行,金币数
map<pair<int,int>,int>id;
int main()
{
len=;memset(last,,sizeof(last));
memset(w,,sizeof(w));
qread(n);qread(m);qread(T);st=T+;ed=st+;
for(int i=;i<=T;i++){qread(x[i]);qread(y[i]);qread(w[i]);id[make_pair(x[i],y[i])]=i;}
//黄-->黑-->红-->绿
for(int i=;i<=T;i++)
{
if(x[i]%==)//黑或黄
{
if(y[i]%==)ins(st,i,w[i]);//黄
else//黑
{
if(id[make_pair(x[i]+,y[i])])ins(id[make_pair(x[i]+,y[i])],i,inf);
if(id[make_pair(x[i],y[i]+)])ins(id[make_pair(x[i],y[i]+)],i,inf);
if(id[make_pair(x[i],y[i]-)])ins(id[make_pair(x[i],y[i]-)],i,inf);
}
}
if(x[i]%==)//黑或黄
{
if(y[i]%==)ins(st,i,w[i]);//黄
else//黑
{
//黑-->黄
if(id[make_pair(x[i],y[i]-)])ins(id[make_pair(x[i],y[i]-)],i,inf);
if(id[make_pair(x[i],y[i]+)])ins(id[make_pair(x[i],y[i]+)],i,inf);
if(id[make_pair(x[i]-,y[i])])ins(id[make_pair(x[i]-,y[i])],i,inf); //黑-->红(计算w)
if(id[make_pair(x[i]+,y[i])])
ins(i,id[make_pair(x[i]+,y[i])],min(w[i],w[id[make_pair(x[i]+,y[i])]]));
}
}
if(x[i]%==)//红或绿
{
if(y[i]%==)//红
{
if(id[make_pair(x[i],y[i]-)])ins(i,id[make_pair(x[i],y[i]-)],inf);
if(id[make_pair(x[i],y[i]+)])ins(i,id[make_pair(x[i],y[i]+)],inf);
if(id[make_pair(x[i]+,y[i])])ins(i,id[make_pair(x[i]+,y[i])],inf);
}
else ins(i,ed,w[i]);//绿
}
if(x[i]%==)//红或绿
{
if(y[i]%==)//红
{
//红-->绿
if(id[make_pair(x[i],y[i]-)])ins(i,id[make_pair(x[i],y[i]-)],inf);
if(id[make_pair(x[i],y[i]+)])ins(i,id[make_pair(x[i],y[i]+)],inf);
if(id[make_pair(x[i]-,y[i])])ins(i,id[make_pair(x[i]-,y[i])],inf); //黑-->红
if(id[make_pair(x[i]+,y[i])])
ins(id[make_pair(x[i]+,y[i])],i,min(w[i],w[id[make_pair(x[i]+,y[i])]]));
}
else ins(i,ed,w[i]);//绿
}
}
int ans=;
while(bt_h())ans+=find_flow(st,inf);
printf("%d\n",ans);
return ;
}

bzoj4823: [Cqoi2017]老C的方块(最小割)的更多相关文章

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

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

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

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

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

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

  4. [bzoj4823][Cqoi2017]老C的方块

    来自FallDream的博客,未经允许,请勿转载,谢谢. 挺有意思的一道题.... 看完题面比较明确是最小割,考虑怎么建图 想了比较久 突破口应该是题目中那张奇怪的图 观察这个奇怪的图和方块,很容易发 ...

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

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

  6. bzoj 4823 & 洛谷 P3756 老C的方块 —— 最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 https://www.luogu.org/problemnew/show/P3756 ...

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

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

  8. 【洛谷P3756】[CQOI2017]老C的方块(最小割)

    洛谷 题意: 给出一个网格图类似于这样: 现在给出一个\(n*m\)大小的网格,之后会给出一些点,若某些点相连形成了如下的几个图案,那么就是不好的. 现在可以删去一些点,但删除每个点都有一些代价,问最 ...

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

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

随机推荐

  1. [iOS翻译]《iOS7 by Tutorials》在Xcode 5里使用单元測试(上)

    简单介绍: 单元測试是软件开发的一个重要方面.毕竟,单元測试能够帮你找到bug和崩溃原因,而程序崩溃是Apple在审查时拒绝app上架的首要原因. 单元測试不是万能的,但Apple把它作为开发工具包的 ...

  2. BZOJ 2124: 等差子序列 线段树维护hash

    2124: 等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一 ...

  3. 根据EXCEL模板填充数据

    string OutFileName = typeName+"重点源达标率" + DateTime.Now.ToString("yyyy-MM-dd");    ...

  4. Windows下慎用内核隔离

    1. 开启内核隔离后只能通过注册表关闭   2. 开启内核隔离后, 默认会启动hybrid-v, 这个东西和虚拟机是冲突的, 这样就用不了虚拟机了.   3. 解决方法: 关闭内核隔离后, 再关闭已经 ...

  5. 7.gcc的使用

    什么是gcc gcc编译器(GNU C Compiler) 现在我们所说的 gcc 是 GUN Compiler Collection的缩写,可以支持多种语言编译,比如 C,C++,Java, pas ...

  6. linux服务器卸载本机默认安装的jdk

    1.      查看系统安装的版本情况: rpm -qa | grep jdk rpm -qa | grep gcj 2.      查看并删除 [root@iZ2zeedm3x12d8xb4g15a ...

  7. Spark Streaming概念学习系列之SparkStreaming的高层抽象DStream

    不多说,直接上干货! SparkStreaming的高层抽象DStream 为了便于理解,Spark Streaming提出了DStream抽象,代表连续不断的数据流. DStream 是一个持续的R ...

  8. PHP日期和时间处理组件-Carbon

    https://packagist.org/packages/nesbot/carbon 我们使用PHP时经常需要处理日期和时间,有时会被时间时区搞混淆,而Carbon是PHP中很人性化的时间日期处理 ...

  9. T7315 yyy矩阵折叠(长)

    题目背景 全场基本暴零 题目描述 输入输出格式 输入格式: 如图 输出格式: 如图 输入输出样例 输入样例#1: 2 2 1 -2 3 -4 输出样例#1: 4 输入样例#2: 2 5 1 -2 -3 ...

  10. html5 好用功能总结

    1.表格元素 a.<caption>设置表格标题 b.<colgroup> . <col> 设置列 //style span 2.分组元素 a.<blockq ...