【BZOJ1976】能量魔方 [最小割]
能量魔方
Time Limit: 10 Sec Memory Limit: 64 MB
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
P?
??
??
N?
Sample Output
PN
NP
NP
NN
HINT
n<=40
Main idea
给出一个n*n*n的矩阵,其中每一个方块可以涂两种颜色,相邻的两个方块如果涂上的颜色不同,就会产生能量。已知了一些方块的颜色,询问最多可以的最多能量。
Solution
发现n<=40,大胆猜测是个网络流。思考过后,发现直接求不好连边,那么我们考虑求出最小损耗,然后用(总收益)-(最小损耗)。
由于相邻的才对答案有贡献,所以我们想到了黑白染色,将所有点划分为两类,那么显然将相邻的点都连一条双向边,权值为1。然后我们考虑如何处理已经规定的点,这时候可以令S集表示1,令T集表示0,将白点的1连向T权值为INF,将S连向黑点的1权值为INF,这样就可以表示不可选了,点权为0则相反。然后跑一遍最小割,计算即可。
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
#define ID(x,y,z) ((z-1)*n*n + (x-1)*n + y) const int ONE=;
const int TWO=;
const int INF=; int n,S,T;
char ch[ONE],c;
int a[][][];
int next[TWO],first[TWO],go[TWO],w[TWO],tot;
int q[],tou,wei;
int Dep[ONE],E[TWO];
int Ans; int get()
{
int res=,Q=;char c;
while( (c=getchar())< || c> )
if(c=='-')Q=-;
res=c-;
while( (c=getchar())>= && c<= )
res=res*+c-;
return res*Q;
} void Add(int u,int v,int z)
{
next[++tot]=first[u]; first[u]=tot; go[tot]=v; w[tot]=z;
next[++tot]=first[v]; first[v]=tot; go[tot]=u; w[tot]=;
} void Double_Add(int u,int v,int z)
{
Add(u,v,z);
Add(v,u,z);
} int PD(int x,int y,int z)
{
return (x+y+z)%;
} int Bfs()
{
memset(Dep,,sizeof(Dep));
tou=; wei=; Dep[]=; q[]=;
for(int u=;u<=T-;u++) E[u]=first[u];
while(tou<wei)
{
int u=q[++tou];
for(int e=first[u];e;e=next[e])
{
int v=go[e];
if(Dep[v] || !w[e]) continue;
Dep[v]=Dep[u]+;
q[++wei]=v;
}
}
return Dep[T]>;
} int Dfs(int u,int Limit)
{
if(u==T || !Limit) return Limit;
int flow=,f;
for(int &e=E[u];e;e=next[e])
{
int v=go[e];
if(Dep[v]!=Dep[u]+ || !w[e]) continue;
f=Dfs(v,min(Limit,w[e]));
w[e]-=f;
w[((e-)^)+]+=f;
Limit-=f;
flow+=f;
if(!Limit) break;
}
return flow;
} int main()
{
cin>>n; S=; T=n*n*n+;
for(int z=;z<=n;z++)
for(int x=;x<=n;x++)
{
scanf("%s",ch+);
for(int y=;y<=n;y++)
{
if(ch[y]=='?') a[x][y][z]=;
if(ch[y]=='P') a[x][y][z]=;
if(ch[y]=='N') a[x][y][z]=;
}
} for(int z=;z<=n;z++)
for(int x=;x<=n;x++)
for(int y=;y<=n;y++)
{
if(a[x+][y][z]) Double_Add(ID(x,y,z),ID(x+,y,z),),Ans++;
if(a[x][y+][z]) Double_Add(ID(x,y,z),ID(x,y+,z),),Ans++;
if(a[x][y][z+]) Double_Add(ID(x,y,z),ID(x,y,z+),),Ans++; if(a[x][y][z]==)
{
if(PD(x,y,z)) Add(S,ID(x,y,z),INF);
else Add(ID(x,y,z),T,INF);
} if(a[x][y][z]==)
{
if(PD(x,y,z)) Add(ID(x,y,z),T,INF);
else Add(S,ID(x,y,z),INF);
}
} while(Bfs())
{
Ans-=Dfs(S,INF);
} printf("%d",Ans);
}
【BZOJ1976】能量魔方 [最小割]的更多相关文章
- 【二分 最小割】cf808F. Card Game
Digital collectible card games have become very popular recently. So Vova decided to try one of thes ...
- 【BZOJ1976】[BeiJing2010组队]能量魔方 Cube 最小割
[BZOJ1976][BeiJing2010组队]能量魔方 Cube Description 小C 有一个能量魔方,这个魔方可神奇了,只要按照特定方式,放入不同的 能量水晶,就可以产生巨大的能量. 能 ...
- 【BZOJ-1976】能量魔方Cube 最小割 + 黑白染色
1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 884 Solved: 307[Submi ...
- 【bzoj1976】[BeiJing2010组队]能量魔方 Cube 网络流最小割
题目描述 一个n*n*n的立方体,每个位置为0或1.有些位置已经确定,还有一些需要待填入.问最后可以得到的 相邻且填入的数不同的点对 的数目最大. 输入 第一行包含一个数N,表示魔方的大小. 接下来 ...
- Bzoj 1976: [BeiJing2010组队]能量魔方 Cube 最小割,最大流
1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 879 Solved: 304[Submi ...
- BZOJ 1976 能量魔方 Cube(最小割)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1976 题意:给出一个n*n*n的立方体.每个小单位为字母P或者字母N.相邻两个小单位字母 ...
- BZOJ1976: [BeiJing2010组队]能量魔方 Cube
1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 832 Solved: 281[Submi ...
- 二分图&网络流&最小割等问题的总结
二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...
- 基于模糊聚类和最小割的层次化网格分割算法(Hierarchical Mesh Decomposition)
网格分割算法是三维几何处理算法中的重要算法,具有许多实际应用.[Katz et al. 2003]提出了一种新型的层次化网格分割算法,该算法能够将几何模型沿着凹形区域分割成不同的几何部分,并且可以避免 ...
随机推荐
- android .9图制作
andorid .9 图,可用于适配各种屏幕.制作的时候,很简单. 在stadio 里面,把鼠标放到图片的边界,点一下.这时候,图片的边缘会有黑块. 然后把鼠标放到黑块上,发现可以拉伸区域了. 这个区 ...
- 形象的理解Strong和Weak
Strong Weak
- mcrouter facebook 开源的企业级memcached代理
原文地址:https://code.facebook.com/posts/296442737213493/introducing-mcrouter-a-memcached-protocol-route ...
- 9.0 toast定位+WebDriverWait显示等待
Toast 判断-----基本操作问题 首先基本操作,进入安卓市场的账号密码页面--- from appium import webdriver from selenium.webdriver.su ...
- CentOS7 Zabbix4.0环境下的安装和配置实例
1.安装准备 Zabbix4.0对基础架构有一定的要求,对的英文尤其PHP状语从句:MySQL: 类型 内容 服务端运行环境 Linux和PHP与Web服务器和数据库 服务端操作系统 CentOS7. ...
- java设计模式之责任链模式以及在java中作用
责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...
- nopcommerce商城系统--开发者常遇问题清单
原址:http://www.nopcommerce.com/docs/74/frequently-asked-development-questions.aspx 以下是开发者常见问题的清单.也介绍了 ...
- video on web
一.video容器 你可能经常看到.avi或.mp4的视频文件,实际上avi或者mp4只是一种视频容器.打个比方,ZIP的压缩文件可以包含各种各样的文件,同理,视频容器也定义用来怎么存放各种 ...
- hadoop 2.6.0 伪分布式部署安装遇到的问题
之前读到了一篇关于配置安装hadoop的博文(地址:http://www.powerxing.com/install-hadoop/)能正确安装和运行,但是在网页进行Jobtracker监控时,输入l ...
- 数组中键key相等时,后面的值覆盖前面的值
<?php $arr[]='abc'; $arr[]='; $arr[]='; $arr[]='; var_dump($arr); 结果;