BZOJ 1976 能量魔方 Cube(最小割)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1976
题意:给出一个n*n*n的立方体。每个小单位为字母P或者字母N。相邻两个小单位字母不同则总价值加1。现在有些小单位的字母已经确定,合理安排其他小单位的字母使得总价值最大?
思路:显然,若所有小单位都未确定,则进 行黑白染色即PN相间的安排时价值最大。基于这样的考虑,我们将所有小单位分成黑白两种颜色,设为A和B。显然同一种颜色之间是不会相邻的。设S集合为A 集合中的P(就是已经给出的)和B集合中的N,T集合为A集合中的N和B集合中的P,并且与ST的流量为INF。然后相邻的小单位之间连边,并记录边的数 量ans,那么ans减去最小割即是答案。为什么呢?显然,若原来给出的没有一个NP,则最小割为0,那么答案就是边的数量。有了一些NP,那么割边不会 是与ST的连边(因为这些边流量为INF),因此割边就是原来相邻小单位的边,而割到了这些边就相当于是这两个小单位染色相同,因此答案减去1,也就是每 有一个这样的割边答案就减去1。因此减去所有割就是答案。最小割决定答案最大。
struct node
{
int v,cap,next;
};
node edges[N];
int head[N],e;
void add(int u,int v,int cap)
{
edges[e].v=v;
edges[e].cap=cap;
edges[e].next=head[u];
head[u]=e++;
}
void Add(int u,int v,int cap)
{
add(u,v,cap);
add(v,u,0);
}
int pre[N],cur[N],num[N],h[N];
int Maxflow(int s,int t,int n)
{
int i;
for(i=0;i<=n;i++) cur[i]=head[i],num[i]=h[i]=0;
int u=s,Min,k,v;
int ans=0;
while(h[u]<n)
{
if(u==t)
{
Min=INF;
for(i=s;i!=t;i=edges[cur[i]].v)
{
k=cur[i];
if(edges[k].cap<Min) Min=edges[k].cap,v=i;
}
ans+=Min; u=v;
for(i=s;i!=t;i=edges[cur[i]].v)
{
k=cur[i];
edges[k].cap-=Min;
edges[k^1].cap+=Min;
}
}
for(i=cur[u];i!=-1;i=edges[i].next)
{
if(edges[i].cap>0&&h[u]==h[edges[i].v]+1) break;
}
if(i!=-1)
{
cur[u]=i;
pre[edges[i].v]=u;
u=edges[i].v;
}
else
{
if(--num[h[u]]==0) break;
k=n;
cur[u]=head[u];
for(i=head[u];i!=-1;i=edges[i].next)
{
if(edges[i].cap>0&&h[edges[i].v]<k)
{
k=h[edges[i].v];
}
}
num[k+1]++;
h[u]=k+1;
if(u!=s) u=pre[u];
}
}
return ans;
}
int n,m,a[45][45][45];
int dx[]={1,0,0,-1,0,0};
int dy[]={0,1,0,0,-1,0};
int dz[]={0,0,1,0,0,-1};
char s[45][45][45];
int ok(int x)
{
return x&1;
}
int main()
{
RD(n);
int i,j,k,r=0;
FOR1(i,n) FOR1(j,n) FOR1(k,n) a[i][j][k]=++r;
int S=0,T=n*n*n+1;
clr(head,-1);
int x,y,z,ans=0;
FOR1(i,n) FOR1(j,n) RD(s[i][j]+1);
FOR1(i,n) FOR1(j,n) FOR1(k,n)
{
FOR0(r,6)
{
x=i+dx[r];
y=j+dy[r];
z=k+dz[r];
if(x>=1&&x<=n&&y>=1&&y<=n&&z>=1&&z<=n)
{
ans++;
Add(a[i][j][k],a[x][y][z],1);
}
}
if(s[i][j][k]!='?')
{
if(ok(i+j+k)&&s[i][j][k]=='P'||!ok(i+j+k)&&s[i][j][k]=='N')
{
Add(S,a[i][j][k],INF);
}
else Add(a[i][j][k],T,INF);
}
}
ans>>=1;
ans-=Maxflow(S,T,T+1);
PR(ans);
}
BZOJ 1976 能量魔方 Cube(最小割)的更多相关文章
- Bzoj 1976: [BeiJing2010组队]能量魔方 Cube 最小割,最大流
1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 879 Solved: 304[Submi ...
- 【BZOJ-1976】能量魔方Cube 最小割 + 黑白染色
1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 884 Solved: 307[Submi ...
- 【BZOJ1976】[BeiJing2010组队]能量魔方 Cube 最小割
[BZOJ1976][BeiJing2010组队]能量魔方 Cube Description 小C 有一个能量魔方,这个魔方可神奇了,只要按照特定方式,放入不同的 能量水晶,就可以产生巨大的能量. 能 ...
- BZOJ1976: [BeiJing2010组队]能量魔方 Cube
1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 832 Solved: 281[Submi ...
- 【bzoj1976】[BeiJing2010组队]能量魔方 Cube 网络流最小割
题目描述 一个n*n*n的立方体,每个位置为0或1.有些位置已经确定,还有一些需要待填入.问最后可以得到的 相邻且填入的数不同的点对 的数目最大. 输入 第一行包含一个数N,表示魔方的大小. 接下来 ...
- [BZOJ 3144] [Hnoi2013] 切糕 【最小割】
题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...
- [BZOJ 3894] 文理分科 【最小割】
题目链接:BZOJ - 3894 题目分析 最小割模型,设定一个点与 S 相连表示选文,与 T 相连表示选理. 那么首先要加上所有可能获得的权值,然后减去最小割,即不能获得的权值. 那么对于每个点,从 ...
- BZOJ 2039 人员雇佣 二元关系 最小割
题面太长了,请各位自行品尝—>人员雇佣 分析: 借用题解的描述: a.选择每个人有一个代价Ai b.如果有两个人同时选择就可以获得收益Ei,j c.如果一个人选择另一个不选会产生代价Ei,j 这 ...
- BZOJ 2007 海拔(平面图最小割-最短路)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2007 题意:给出一个n*n的格子,那么顶点显然有(n+1)*(n+1)个.每两个相邻顶点 ...
随机推荐
- 夺命雷公狗ThinkPHP项目之----企业网站12之文章添加的实现
我们现在就开始写文章添加了,居然是添加当然布列外,我们还是要先讲模版搞定再说被: <!doctype html> <html> <head> <meta ch ...
- lower power的physical library
在一个cell library中,比较重要的是cell height,cell height由tracks来决定,track表示一个metal线的pitch. 一个cell通常被做成一定数量的trac ...
- Android SDK 安卓失败 提示: “Failed to fetch URL…” 的错误提示
解决方法: 1. 打开Tools 选择 options 将 第一个复选框勾上. (尝试一下,如果还是失败,参考2) 2. 打开本地host 文件, 在最后一行添加 ...
- 修改linux下mysql目录权限
1.进入当前目录:例cd /srun3/mysql 2.修改权用户限 chown -R mysql ipt_authd_remote(表示给ipt_authd_remotemysql权限) 3.修改用 ...
- Native OR WebApp ?
前两天刚好和一帮产品同学聊过,特指一个APP里面的各页面应该怎么做,大家的总结如下,原理一样,关键是了解Native和Web各自的优劣势:1. 偏交互的Native,偏浏览的Web:交互指复杂操作,输 ...
- startActivityForResult 页面跳转回调
import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util. ...
- 内容与Tag
由于要满足精准推送内容的需求, 我们需要将车辆型号与推送内容挂钩, 方法是, 在现有的基础上, 把所有车型, 打上Tag, 目前先打上国籍跟厂商. 在现有的VEHICLE表的基础上, 增加2个colu ...
- 数据库日期格式为int型时存取格式
存入当前日期:time() 取出并转化为日期格式:date('Y-m-d H:i:s',strtotime($time)); 最好在前面加上这句: date_default_timezone_set( ...
- WPF single instance
转自:http://www.cnblogs.com/z_lb/archive/2012/09/16/2687487.html public partial class App : Applicatio ...
- 【Pro ASP.NET MVC 3 Framework】.学习笔记.4.MVC的主要工具-使用Moq
在之前的例子中,我们创建了FakeRepository类来支持我们的测试.但是我们还没有解释如何穿件一个真实的repository实现,我们需要一个替代品.一旦我们有一个真的实现,我们可能不会再用它, ...