题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823

https://www.luogu.org/problemnew/show/P3756

巧妙建图;

其实“俄罗斯方块”就是选择一条特殊边两边的方格,左右两边周围的六个中再各选两个;

于是可以把图“四分”,特殊边两边的格子算两种,而且奇数行和偶数行恰好相反,然后两边围着的格子也算两种;

然后不能有上面四种可选方格同时存在的情况,建出图来跑最小割即可。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
int const xn=2e5+,xm=2e6+,inf=1e9;
int C,R,n,hd[xn],ct=,to[xm],nxt[xm],c[xm],dis[xn],cur[xn],S,T;
map<int,int>mp[xn];
struct N{int x,y;}p[xn];
queue<int>q;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
void ade(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct; c[ct]=z;}
void add(int x,int y,int z){ade(x,y,z); ade(y,x,);}
int tp(int x,int y)
{
int d=y%;
if(x&){if(d==)return ; if(d==)return ; if(d==)return ; if(!d)return ;}
else {if(d==)return ; if(d==)return ; if(d==)return ; if(!d)return ;}
}
void addedge(int a,int b,int x,int y)
{
if(a==&&b==)add(n+x,y,inf);
else if(a==&&b==)add(n+x,y,inf);
else if(a==&&b==)add(n+x,y,inf);
}
bool bfs()
{
for(int i=S;i<=T;i++)dis[i]=;
dis[S]=; q.push(S);
while(q.size())
{
int x=q.front(); q.pop();
for(int i=hd[x],u;i;i=nxt[i])
if(!dis[u=to[i]]&&c[i])dis[u]=dis[x]+,q.push(u);
}
return dis[T];
}
int dfs(int x,int fl)
{
//printf("x=%d fl=%d\n",x,fl);
if(x==T)return fl;
int ret=;
for(int &i=cur[x],u;i;i=nxt[i])
{
if(dis[u=to[i]]!=dis[x]+||!c[i])continue;
int tmp=dfs(u,min(fl-ret,c[i]));
if(!tmp)dis[u]=;
c[i]-=tmp; c[i^]+=tmp;
ret+=tmp; if(ret==fl)break;
}
return ret;
}
int main()
{
C=rd(); R=rd(); n=rd(); S=; T=*n+;
for(int i=,x,y,w;i<=n;i++)
{
y=p[i].y=rd(); x=p[i].x=rd(); w=rd();
mp[x][y]=i; add(i,n+i,w);
int t=tp(p[i].x,p[i].y);
if(t==)add(S,i,inf);
if(t==)add(n+i,T,inf);
}
for(int i=;i<=n;i++)
{
int x=p[i].x,y=p[i].y,t=tp(x,y);
if(x>&&mp[x-][y]){int tt=tp(x-,y); addedge(t,tt,i,mp[x-][y]);}
if(y>&&mp[x][y-]){int tt=tp(x,y-); addedge(t,tt,i,mp[x][y-]);}
if(x<R&&mp[x+][y]){int tt=tp(x+,y); addedge(t,tt,i,mp[x+][y]);}
if(y<C&&mp[x][y+]){int tt=tp(x,y+); addedge(t,tt,i,mp[x][y+]);}
}
int ans=;
while(bfs())
{
memcpy(cur,hd,sizeof hd);
ans+=dfs(S,inf);
}
printf("%d\n",ans);
return ;
}

bzoj 4823 & 洛谷 P3756 老C的方块 —— 最小割的更多相关文章

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

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

  2. 【洛谷P3973】[TJOI2015]线性代数(最小割)

    洛谷 题意: 给出一个\(n*n\)的矩阵\(B\),再给出一个\(1*n\)的矩阵\(C\). 求一个\(1*n\)的\(01\)矩阵\(A\),使得\(D=(A\cdot B-C)\cdot A^ ...

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

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

  4. 2018.08.02 洛谷P3355 骑士共存问题(最小割)

    传送门 这题让我联想到一道叫做方格取数问题的题,如果想使摆的更多,就要使不能摆的更少,因此根据骑士的限制条件建图,求出至少有多少骑士不能摆,减一减就行了. 代码: #include<bits/s ...

  5. 【洛谷 P3227】 [HNOI2013]切糕(最小割)

    题目链接 每层每个位置向下一层这个位置连边,流量为下一层这个位置的\(f\),源点向第一层连,流量第一层每个位置的费用,最后一层向汇点连,流量\(INF\). 这样就得到了\(P*Q\)条链,不考虑\ ...

  6. 洛谷P3355 骑士共存问题(最小割)

    传送门 de了两个小时的bug愣是没发现错在哪里……没办法只好重打了一遍竟然1A……我有点想从这里跳下去了…… 和方格取数问题差不多,把格子按行数和列数之和的奇偶性分为黑的和白的,可以发现某种颜色一定 ...

  7. 洛谷 - P2762 - 太空飞行计划问题 - 最小割

    https://www.luogu.org/problemnew/solution/P2762 最小割对应的点,在最后一次更新中dinic的bfs会把他的dep重置掉.所以可以根据这个性质复原最小割. ...

  8. 洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图

    第一次做最小割,不是很理解. https://www.luogu.org/problemnew/show/P1361 要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点 ...

  9. 洛谷P2774 方格取数问题(最小割)

    题意 $n \times m$的矩阵,不能取相邻的元素,问最大能取多少 Sol 首先补集转化一下:最大权值 = sum - 使图不连通的最小权值 进行黑白染色 从S向黑点连权值为点权的边 从白点向T连 ...

随机推荐

  1. [APIO2008]免费道路

    [APIO2008]免费道路 BZOJ luogu 先把必须连的鹅卵石路连上,大于k条no solution 什么样的鹅卵石路(u,v)必须连?所有水泥路都连上仍然不能使u,v连通的必须连 补全到k条 ...

  2. 简易bootloader重定位问题

           单板选择NandFlash启动,则硬件上电后,系统会自己主动将NandFlash中的前4K内容复制到STEPSTONE即4K SRAM中.然后从SRAM中的0X0地址启动. 基于mini ...

  3. 003-unity3d 物理引擎简介以及示例

    一.概述 物理引擎就是模拟真实世界中物体碰撞.跌落等反应的引擎,通过ballence.愤怒的小鸟等理解.Unity3D的物理引擎使用的是Nvidia的PhysX. 物理引擎是一个计算机程序模拟牛顿力学 ...

  4. Iptalbes练习题(二)

    接着上节,上节课,基本功能设置后,现在我们telnet本机一下,发现问题: [root@test1 ~]# telnet Trying 127.0.0.1... telnet: connect to ...

  5. awk 运算符(算术运算符,赋值运算符,关系运算符,逻辑运算符,正则运算符)说明

    awk作为文本处理优秀工具之一,它有独自丰富的运算符.下面我们一起归纳总结一下,所有运算符. 可以分为:算术运算符,赋值运算符,关系运算符,逻辑预算法,正则运算符. 一.运算符介绍 运算符 描述 赋值 ...

  6. ubuntu service XXX start启动报start: Rejected send message, 1 matche

    service cron restart命令报错如下: stop: Rejected send message, 1 matched rules; type="method_call&quo ...

  7. Python OOP(3) staticmethod和classmethod统计实例

    staticmethod 统计实例 #!python2 #-*- coding:utf-8 -*- class c1: amount_instance=0 def __init__(self): c1 ...

  8. 转 Hadoop傻瓜化:Datameer大数据收入翻三番

      淘薛奎发布到 <数据极客> 06-28 16:04 随着分析正在成为企业IT的核心,昔日的BI- ETL-EDW分析范型已经完全落伍,不再适用.而力推“大数据傻瓜化”的Datameer ...

  9. [算法]String to Integer(atoi)

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  10. hiho一下 第四十八周 拓扑排序·二【拓扑排序的应用 + 静态数组 + 拓扑排序算法的时间优化】

    题目1 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当 ...