1976: [BeiJing2010组队]能量魔方 Cube

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 879  Solved: 304
[Submit][Status][Discuss]

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。

Source

题解:

最小割,思路很好。

我们可以发现这道题与之前的几道题略有不同,这里是两个格子所属类别不同时获得某种收益。所以我们单纯地按照两个类别建立源点和汇点,连边求最小割就行不通了。

那怎么办呢?能不能还用最小割解决呢?

答案当然是能,不然我第一行为什么会写“最小割”三个字…2333

我们考虑能不能有一种方案,让任意两个相邻格子颜色都不同。当然是可以的,只要对一个n*n*n的立方体黑白染色就可以了。对于黑色,我们用s表示positive,t表示negative;相反地,对于白色,用s表示negative,t表示positive。这样,我们就把所属与不同类别转化为所属相同类别。是不是很机智啊!

但是题目中是有限定条件的,也就是有些点的类别是固定的,这也很好办。比如说对于黑色,如果已经确定为positive,连边(s,i,inf);如果已经确定为negative,连边(i,t,inf)。因为inf的边一定不会成为割,也就保证了i节点一定属于s割或者t割,即保证了它是positive或者negative。白色同理。

然后对于任意两个相邻格子i和j,连边(i,j,1)(j,i,1)。

最后跑一次最小割,从总收益中减去最小割即为答案。

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAXN 64020
#define INF 1e9
struct node
{
int begin,end,value,next;
}edge[*MAXN];
int cnt,Head[MAXN],S,T,dis[MAXN],q[MAXN],n,cur[MAXN]; void addedge(int bb,int ee,int vv)
{
edge[++cnt].begin=bb;edge[cnt].end=ee;edge[cnt].value=vv;edge[cnt].next=Head[bb];Head[bb]=cnt;
}
void addedge1(int bb,int ee,int vv)
{
addedge(bb,ee,vv);addedge(ee,bb,);
}
int xyz(int x,int y,int z){return (x-)*n*n+(y-)*n+z;}
int BFS()
{
int head,tail,i,u,v;
head=;tail=;q[tail]=S;
memset(dis,-,sizeof(dis));dis[S]=;//0打成-1了。。。改死我了。。。
while(head!=tail)
{
head++;if(head==)head=;
u=q[head];
for(i=Head[u];i!=-;i=edge[i].next)
{
v=edge[i].end;
if(edge[i].value>&&dis[v]<)
{
dis[v]=dis[u]+;
tail++;if(tail==)tail=;
q[tail]=v;
}
}
}
if(dis[T]<=)return ;
else return ;
}
int DFS(int u,int minflow)
{
int used=,ans=,i,v;
if(u==T)return minflow;
for(i=Head[u];i!=-;i=edge[i].next)
{
v=edge[i].end;
if(edge[i].value>&&dis[v]==dis[u]+)
{
ans=minflow-used;
ans=DFS(v,min(ans,edge[i].value));
edge[i].value-=ans;
edge[i^].value+=ans;
used+=ans;
if(used==minflow)return minflow;
}
}
if(used==)dis[u]=-;
return used;
}
int Dinic()
{
int maxflow=,ans=,i;
while(BFS()){for(i=;i<=T;i++)cur[i]=Head[i];ans=DFS(S,INF);if(ans==)break;maxflow+=ans;}
return maxflow;
}
int main()
{
int i,j,k,XYZ,ans;
char ch;
scanf("%d",&n);
S=n*n*n+;T=S+;//S代表和正能量水晶连,T代表和负能量水晶连.
memset(Head,-,sizeof(Head));cnt=;
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
for(k=;k<=n;k++)
{
if(i!=n)addedge1(xyz(i,j,k),xyz(i+,j,k),);
if(j!=n)addedge1(xyz(i,j,k),xyz(i,j+,k),);
if(k!=n)addedge1(xyz(i,j,k),xyz(i,j,k+),);
if(i!=)addedge1(xyz(i,j,k),xyz(i-,j,k),);
if(j!=)addedge1(xyz(i,j,k),xyz(i,j-,k),);
if(k!=)addedge1(xyz(i,j,k),xyz(i,j,k-),);
}
}
}
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
scanf("\n");
for(k=;k<=n;k++)
{
scanf("%c",&ch);
XYZ=xyz(i,j,k);
if((i+j+k)%==)//黑白染色.
{
if(ch=='P')addedge1(S,XYZ,INF);
else if(ch=='N')addedge1(XYZ,T,INF);
//else addedge1(S,XYZ,INF);
}
else
{
if(ch=='P')addedge1(XYZ,T,INF);
else if(ch=='N')addedge1(S,XYZ,INF);
//else addedge1(XYZ,T,INF);
}
}
}
if(i!=n)scanf("\n");
}
ans=Dinic();
printf("%d",*n*n*(n-)-ans);
fclose(stdin);
fclose(stdout);
return ;
// while(1) getchar();
//getchar();
}

Bzoj 1976: [BeiJing2010组队]能量魔方 Cube 最小割,最大流的更多相关文章

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

    [BZOJ1976][BeiJing2010组队]能量魔方 Cube Description 小C 有一个能量魔方,这个魔方可神奇了,只要按照特定方式,放入不同的 能量水晶,就可以产生巨大的能量. 能 ...

  2. BZOJ1976: [BeiJing2010组队]能量魔方 Cube

    1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 832  Solved: 281[Submi ...

  3. 【BZOJ-1976】能量魔方Cube 最小割 + 黑白染色

    1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 884  Solved: 307[Submi ...

  4. 【bzoj1976】[BeiJing2010组队]能量魔方 Cube 网络流最小割

    题目描述 一个n*n*n的立方体,每个位置为0或1.有些位置已经确定,还有一些需要待填入.问最后可以得到的 相邻且填入的数不同的点对 的数目最大. 输入 第一行包含一个数N,表示魔方的大小. 接下来 ...

  5. hdu4289 最小割最大流 (拆点最大流)

    最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...

  6. 【BZOJ-1797】Mincut 最小割 最大流 + Tarjan + 缩点

    1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1685  Solved: 724[Submit] ...

  7. BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...

  8. hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)

    /** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...

  9. BZOJ1001:狼抓兔子(最小割最大流+vector模板)

    1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...

随机推荐

  1. XSS漏洞(跨站脚本)

    不要轻信用户提交上来的数据alert消息太难看,因此开发一个aspx页面用来统一展示消息ShowMessage.ashx //主页将判断重定向到另一个页面 if (TextBox1.Text != & ...

  2. ubuntu mint 15 编译安装PHP开发环境

    php 5.3.5(download zip) httpd 2.2.24(download zip) mysql: apt-get install mysql step 1: install mysq ...

  3. 《APUE》第三章笔记(3)

    文件共享 UNIX系统支持在不同进程中共享打开的文件,首先先用一幅apue的图来介绍一下内核用于I/O文件的数据结构: 如图所见,一个进程都会有一个记录项,记录项中包含有一张打开文件描述符表,每个描述 ...

  4. Java Servlet 回顾

    一.转发请求RequestDispatcher 使用request域对象把数据带给转发资源,与重定向的区别:客户端只发出一次请求,服务器端调用多个资源,客户端浏览器地址栏没改变:转发是一次请求,使用的 ...

  5. 网站开发常用jQuery插件总结(12)固定元素插件scrolltofixed

    这个插件在前段时间用过一次,当时是改一个网站.要求顶部的菜单栏随着滚动条的滚动而固定.也大体写了一下,不过在文章中也只是提了一下,文章地址:jQuery插件固定元素位置. 在这篇文章中,再进行总结一下 ...

  6. 【转】PFILE和SPFILE介绍

    原文:http://blog.sina.com.cn/s/blog_77bba23901017xcl.html 一.PFILE Pfile(Parameter File,参数文件)是基于文本格式的参数 ...

  7. webp介绍与使用

        webp是谷歌10年发布的一种新的图片格式,支持有损压缩或无损压缩.据官方称无损压缩的webp在体积上要比png小26%,而有损压缩要比同质量jpg小25%~34%.经本人测试,由腾讯智图处理 ...

  8. Laravel 5.1 事件、事件监听的简单应用

    ​ 有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作 ...

  9. php发送http请求

    http请求有get,post. php发送http请求有三种方式[我所知道的有三种,有其他的告诉我]. file_get_contents();详情见:http://www.cnblogs.com/ ...

  10. Mysql 与 php动态网站开发 入门教程

    这个系列的教程由表单开始写,因为表单可以把数据库和web 之间的交互表现得很明显.提交表单 ,数据库记录注册信息. 本教程属于基础教程.大神请略过.        对于php和mysql之间的稳固性很 ...