【BZOJ1976】[BeiJing2010组队]能量魔方 Cube 最小割

【BZOJ1976】[BeiJing2010组队]能量魔方 Cube

Description

小C 有一个能量魔方,这个魔方可神奇了,只要按照特定方式,放入不同的 能量水晶,就可以产生巨大的能量。 能量魔方是一个 N*N*N 的立方体,一共用 N3 个空格可以填充能量水晶。 能量水晶有两种: ·一种是正能量水晶(Positive) ·一种是负能量水晶(Negative) 当这个魔方被填满后,就会依据填充的能量水晶间的关系产生巨大能量。对 于相邻两(相邻就是拥有同一个面)的两个格子,如果这两个格子填充的是一正一 负两种水晶,就会产生一单位的能量。而整个魔方的总能量,就是这些产生的能 量的总和。 现在,小 C 已经在魔方中填充了一些水晶,还有一些位置空着。他想知道, 如果剩下的空格可以随意填充,那么在最优情况下,这个魔方可以产生多少能量。

Input

第一行包含一个数N,表示魔方的大小。 接下来 N2 行,每行N个字符,每个字符有三种可能: P:表示此方格已经填充了正能量水晶; N:表示此方格已经填充了负能量水晶; ?:表示此方格待填充。 上述 N*N 行,第(i-1)*N+1~i*N 行描述了立方体第 i 层从前到后,从左到右的 状态。且每 N 行间,都有一空行分隔。

Output

仅包含一行一个数,表示魔方最多能产生的能量

Sample Input

2
P?
??
??
N?

Sample Output

9

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;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7603799.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android activity调用Adapter方法刷新列表UI,RecyclerView.Adapter

在adapter中创建被调用方法cleckAll public class JYfkleixinAdapter extends RecyclerView.Adapter<JYfkleixinAdapter.ViewHolder> {private Context context;private OnItemClickListener mOnItemClickListener;private List<JyfkEntity> entityList;public JY…

vuex 对象嵌套属性的修改 mutations set 很方便的写法

需求&#xff1a;一个对象 const state {user: {verify: {state: 0}} }我需要使用类似this.set({ user.verify.state: 1 })这种写法直接获取或修改state[user.verify.state]的值。不知道别人怎么写的&#xff0c;我的写法如下&#xff1a; const mutations {set(state, par…

eclipse/myeclipse中快捷键 Ctrl+shift+down/up 出现屏幕颠倒的解决方法

1.原因&#xff1a;快捷键被占用 2.解决 如果是被其它软件占用&#xff0c;则修改其它软件的快捷键。 查看快捷键是否被占用工具&#xff1a;http://download.csdn.net/download/muyeju/9999443    如果是Integer占用&#xff0c;则禁用快捷键&#xff0c;桌面右击->图形选…

android 获取图片主色调

在build.gradle添加依赖 compile com.github.florent37:glidepalette:1.0.6 使用 TextView tvColor(TextView) findViewById(R.id.testte); ImageView imageView (ImageView)findViewById(R.id.testimage); tvColor.setText(style); ImageManager.loadAndPalette(MainActivity…

基于B/S架构的故障模型

基于B/S架构的故障模型 基于&#xff22;/&#xff33;架构的软件进行的测试&#xff0c;主要进行的有功能测试、性能测试、安全性测试、配置和兼容性测试、可用性测试、安装部署测试、用户手册、在线帮助测试等。下列分别介绍这些测试的内容。 &#xff11;、 功能…

mongoose 更新元素 DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany

我一开始的写法: const updOne await this.update({ _id: verify_id }, {$set: {// 认证通过&#xff0c;状态设置为1state: 1,// 审核操作人verify_user,verify_at: Date.now()} });使用mongoose更新元素值&#xff0c;报错了DeprecationWarning: collection.update is depr…

mongodb $unwind 聚合管道

$unwind&#xff1a;将文档中的某一个数组类型字段拆分成多条&#xff0c;每条包含数组中的一个值。 需求&#xff1a; {"_id" : ObjectId("5951c5de567ebff0d5011fba"),"name" : "陈晓婵","address" : "北京朝阳区&q…

QC无法启动,实战记录

今天上午QC还用得好好的&#xff0c;下午就突然打不开了&#xff0c;急了&#xff0c;服务重启了一遍还是不行。最后将错误信息截下来&#xff0c;仔细研究&#xff0c;同时也要感谢测试群的朋友们的帮忙&#xff0c;终于找到了一些方向。 下面把错误信息贴出来&#xff1a; …

android butterknife使用详解

添加依赖 compile com.jakewharton:butterknife:8.6.0 annotationProcessor com.jakewharton:butterknife-compiler:8.6.0 //下载最新黄油刀 implementation com.jakewharton:butterknife:10.2.0 annotationProcessor com.jakewharton:butterknife-compiler:10.2.0 …

工作108:swiper使用

<!--首页管理--> <template><div><el-card><h1>等待处理</h1><div style"width: 100%;height: 200px"><swiper ref"mySwiper" ><swiper-slide v-for"(item,index) in task"><el-butt…

背景图片生成网站收集

https://pissang.github.io/little-big-city/ 生成星球 https://alteredqualia.com/ 很多效果 http://www.decrooks.com/ 毛线球生成器

python入门-分类和回归各种初级算法

引自&#xff1a;http://www.cnblogs.com/taichu/p/5251332.html ########################### #说明&#xff1a; # 撰写本文的原因是&#xff0c;笔者在研究博文“http://python.jobbole.com/83563/”中发现 # 原内容有少量笔误&#xff0c;并且对入门学友缺少一些…

Git Bash下载安装,git命令下载项目,上传android项目到github步骤,以及取消项目关联Git,设置git忽略文件

设置忽略文件 1、工程下创建文件夹gitignore。push即可 *.iml .gradle /local.properties /.idea/caches /.idea/libraries /.idea/modules.xml /.idea/workspace.xml /.idea/navEditor.xml /.idea/assetWizardSettings.xml .DS_Store /build /captures .externalNativeBuild …

软件测试是找BUG,不是找茬

做测试久了&#xff0c;经常会有一些感悟&#xff0c;最近在51上看到一贴&#xff0c;说出了我的心声&#xff0c;把我一直想写却一直以时间为借口为由拖着未写的心声写出来&#xff0c;摘抄了部分过不&#xff0c;一起纪念测试的年代&#xff0c;测试的心声。测试好象一直会被…

比较精确的js倒计时实现

// 传入需要倒计时的秒数countDown(times) {// 时间间隔 1秒const interval 1000;// 计算时间&#xff0c;转化为毫秒let ms times * 1000;let count 0;const startTime new Date().getTime();const endTime startTime ms;let timeCounter;timeCounter setTimeout(count…

java 如何让循环结束,跳过某个条件,跳出当前的多重嵌套循环

当数据比较庞大的时候&#xff0c;需要循环遍历某个数据的时候可用 for (int ab 0;ab<10000;ab){if (ab 7){//当找到7的时候&#xff0c;结束循环Log.v("map","..ab 7....11......"ab);break;}else {Log.v("map","......11..else....&qu…