【BZOJ1976】[BeiJing2010组队]能量魔方 Cube 最小割
【BZOJ1976】[BeiJing2010组队]能量魔方 Cube
Description
Input
Output
Sample Input
P?
??
??
N?
Sample Output
HINT
如下状态时,可产生最多的能量。
PN
NP
NP
NN
【数据规模】
10% 的数据N≤3;
30% 的数据N≤4;
80% 的数据N≤10;
100% 的数据N≤40。
题解:经典的最小割模型,只不过变成了三维的。先黑白染色,然后黑色的点翻转源汇,具体方法:
1.S ->i 容量为i周围已确定的N个数
2.i -> T 容量为i周围已确定的P个数
上面2条边要翻转源汇
3.i <-> j 容量1
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
int n,ans,cnt,tot,S,T;
int dx[]={0,0,0,0,1,-1},dy[]={0,0,1,-1,0,0},dz[]={1,-1,0,0,0,0};
int map[50][50][50],to[2000000],next[2000000],val[2000000],d[100000],head[100000];
char str[50];
queue<int> q;
int dfs(int x,int mf)
{
if(x==T) return mf;
int i,k,temp=mf;
for(i=head[x];i!=-1;i=next[i]) if(d[to[i]]==d[x]+1&&val[i])
{
k=dfs(to[i],min(temp,val[i]));
if(!k) d[to[i]]=0;
val[i]-=k,val[i^1]+=k,temp-=k;
if(!temp) break;
}
return mf-temp;
}
int bfs()
{
while(!q.empty()) q.pop();
memset(d,0,sizeof(d));
int i,u;
q.push(S),d[S]=1;
while(!q.empty())
{
u=q.front(),q.pop();
for(i=head[u];i!=-1;i=next[i])
{
if(!d[to[i]]&&val[i])
{
d[to[i]]=d[u]+1;
if(to[i]==T) return 1;
q.push(to[i]);
}
}
}
return 0;
}
inline void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
to[cnt]=a,val[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
}
int main()
{
int i,j,k,l,x,y,z,a,b,c;
scanf("%d",&n);
S=0,T=tot=1;
for(i=1;i<=n;i++) for(j=1;j<=n;j++)
{
scanf("%s",str+1);
for(k=1;k<=n;k++)
{
if(str[k]=='P') map[i][j][k]=1;
if(str[k]=='N') map[i][j][k]=0;
if(str[k]=='?') map[i][j][k]=++tot;
}
}
memset(head,-1,sizeof(head));
for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=1;k<=n;k++)
{
if(map[i][j][k]>1)
{
a=b=0,c=map[i][j][k];
for(l=0;l<6;l++)
{
x=i+dx[l],y=j+dy[l],z=k+dz[l];
if(x&&y&&z&&x<=n&&y<=n&&z<=n)
{
if(map[x][y][z]==0) b++;
if(map[x][y][z]==1) a++;
if(map[x][y][z]>1&&((i^j^k)&1)) add(c,map[x][y][z],1),add(map[x][y][z],c,1),ans++;
}
}
if((i^j^k)&1) swap(a,b);
add(S,c,a),add(c,T,b),ans+=a+b;
}
if(map[i][j][k]==0)
{
for(l=0;l<6;l++)
{
x=i+dx[l],y=j+dy[l],z=k+dz[l];
if(x&&y&&z&&x<=n&&y<=n&&z<=n&&map[x][y][z]==1) ans++;
}
}
}
while(bfs()) ans-=dfs(S,1<<30);
printf("%d",ans);
return 0;
}
【BZOJ1976】[BeiJing2010组队]能量魔方 Cube 最小割的更多相关文章
- Bzoj 1976: [BeiJing2010组队]能量魔方 Cube 最小割,最大流
1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 879 Solved: 304[Submi ...
- BZOJ1976: [BeiJing2010组队]能量魔方 Cube
1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 832 Solved: 281[Submi ...
- 【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 能量魔方 Cube(最小割)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1976 题意:给出一个n*n*n的立方体.每个小单位为字母P或者字母N.相邻两个小单位字母 ...
- 【BZOJ1976】能量魔方 [最小割]
能量魔方 Time Limit: 10 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description 小C 有一个能量魔方,这个魔方可神奇 ...
- 二分图&网络流&最小割等问题的总结
二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...
- 基于模糊聚类和最小割的层次化网格分割算法(Hierarchical Mesh Decomposition)
网格分割算法是三维几何处理算法中的重要算法,具有许多实际应用.[Katz et al. 2003]提出了一种新型的层次化网格分割算法,该算法能够将几何模型沿着凹形区域分割成不同的几何部分,并且可以避免 ...
- [NOI.AC省选模拟赛3.31] 附耳而至 [平面图+最小割]
题面 传送门 思路 其实就是很明显的平面图模型. 不咕咕咕的平面图学习笔记 用最左转线求出对偶图的点,以及原图中每个边两侧的点是谁 建立网络流图: 源点连接至每一个对偶图点,权值为这个区域的光明能量 ...
随机推荐
- scp命令使下用
先说下背景把,使用ubuntu,没有windows以下到xshell软件管理一下vps.正瞅着须要下载一个chrome(chrominum真的不好用).此刻大谷歌正墙外呢,无奈挂着ss firefox ...
- 理解shell中的atime,mtime,ctime
所有文件都有3个时间信息,保存在文件系统中 atime (Access time)是文件最后一此读的时间 或者执行文件的时间 mtime (Modified time)是文件最后一次写的时间(是在写入 ...
- EditPlus设置html和js文件的注释快捷键
EditPlus默认是可以通过快捷键注释html的,格式是 <!-- </label> <label>类型</label> <label> --& ...
- Webpack 的 HtmlWebpackPlugin 如何控制某个 chunks 的 inject 位置?
https://segmentfault.com/q/1010000006591131 通过修改 HtmlWebpackPlugin 源码实现了 修改后的配置: new HtmlWebpackPlug ...
- 光栅化规则(Rasterization Rules)
光栅化规则不是唯一的,只要能满足在扫描线填充过程中,对于一条分割线两边的像素能够被不重复不遗漏地填充即可. 在gdi3d中目前使用的是下面光栅化规则: xLeft_int=ceil(xLeft-0.5 ...
- NativeViewer for VS2010
记得非常久之前公布了一款能够在调试中可视化Mat数据的插件,只是仅仅能用于VS2012及以上.我用的是VS2010(笔记本跑10都卡的不得了,12不敢奢望),不免有些遗憾.非常高兴的say如今这个问题 ...
- 125. Valid Palindrome【easy】
125. Valid Palindrome[easy] Given a string, determine if it is a palindrome, considering only alphan ...
- Google Chrome v48.0.2564.
http://www.pcpop.com/doc/1/1819/1819996.shtml 摘要:谷歌浏览器Chrome Stable 稳定版迎来例行升级,新版本号为v48.0.2564.82,上一版 ...
- linux下调试使用的 一些shell命令
查看文件日期:strings |grep Build gdb g++ gcc make systemctl gdb: bt s n b 1.firewalld的基本使用 启动: systemctl s ...
- mysql 顺序问题
unsigned 必须出在 not null 的前面,如果出现在这个后面就出错呢.