bzoj1976
终于忙完期末考试了,即将进入愉快的暑假(虽然暑假作业奇多,但好歹终于能有大量时间刷题了)
先把上次新一类最小割留下的一道题目A了复习一下;
题目看起来很复杂,实际上和bzoj2132是同一个类型的
用S集合表示放正能量,T集合表示放负能量(可自行参照上一篇文章)
只是有几个不同点:
有些点是已经确定为S或T集合中的点
选择点属于S或者属于T都是没有收益的
对于未知的问题我们要转化为已知的问题来求解
首先我们来处理2,考虑到割是我们所得不到的收益,
于是我们可以把每个点选择属于S或者属于T产生的收益都当做是个1,
也就是对于每个点i,连接s--->i, i--->t 容量为1;
最后ans=n*n*n(抵消我们之前强加的收益)+图中的边数-mincut;
下面就是1没有解决了,考虑到割是我们所得不到的收益,
所以,对于那些已经确定为S集合中的点(T集合同理),我们只要使
s--->i 容量为inf,也就让这条边一定不成为割边,那么就满足了这个点的确定性;
好了,即使是立体的,依然可以黑白染色划分二分图,所以其余实现细节类似bzoj2132,这里不加赘述。
const inf=;
dx:array[..] of integer=(-,,,,,);
dy:array[..] of integer=(,,-,,,);
dz:array[..] of integer=(,,,,-,);
type node=record
next,flow,point:longint;
end; var edge:array[..] of node;
h,numh,p,cur,d,pre:array[..] of longint;
num:array[..,..,..] of longint;
t,len,i,j,n,k,x,y,z,m,ans,sum:longint;
s:ansistring; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; procedure add(x,y,f:longint);
begin
inc(len);
edge[len].point:=y;
edge[len].flow:=f;
edge[len].next:=p[x];
p[x]:=len;
end; function sap:longint;
var u,i,j,q,neck,tmp:longint;
begin
numh[]:=t+;
for i:= to t do
cur[i]:=p[i];
u:=;
sap:=;
neck:=inf;
while h[]<t+ do
begin
d[u]:=neck;
i:=cur[u];
while i<>- do
begin
j:=edge[i].point;
if (edge[i].flow>) and (h[u]=h[j]+) then
begin
cur[u]:=i;
pre[j]:=u;
neck:=min(neck,edge[i].flow);
u:=j;
if u=t then
begin
while u<> do
begin
u:=pre[u];
i:=cur[u];
dec(edge[i].flow,neck);
inc(edge[i xor ].flow,neck);
end;
sap:=sap+neck;
end;
break;
end;
i:=edge[i].next;
end;
if i=- then
begin
dec(numh[h[u]]);
if numh[h[u]]= then exit;
tmp:=t;
i:=p[u];
q:=-;
while i<>- do
begin
j:=edge[i].point;
if (edge[i].flow>) and (h[j]<tmp) then
begin
q:=i;
tmp:=h[j];
end;
i:=edge[i].next;
end;
h[u]:=tmp+;
inc(numh[h[u]]);
cur[u]:=q;
if u<> then
begin
u:=pre[u];
neck:=d[u];
end;
end;
end;
end; begin
len:=-;
fillchar(p,sizeof(p),);
readln(n);
t:=n*n*n+;
for i:= to n do
begin
for j:= to n do
begin
readln(s);
for k:= to n do
begin
inc(m);
num[i,j,k]:=m;
if (s[k]='N') and ((i+j+k) mod =) or (s[k]='P') and ((i+j+k) mod =) then
begin
add(,m,inf);
add(m,,);
add(m,t,);
add(t,m,);
end
else if (s[k]='N') and ((i+j+k) mod =) or (s[k]='P') and ((i+j+k) mod =) then
begin
add(m,t,inf);
add(t,m,);
add(,m,);
add(m,,);
end
else if s[k]='?' then
begin
add(,m,);
add(m,,);
add(m,t,);
add(t,m,);
end;
end;
end;
if i<>n then readln;
end;
for i:= to n do
for j:= to n do
for k:= to n do
for m:= to do
begin
x:=i+dx[m];
y:=j+dy[m];
z:=k+dz[m];
if num[x,y,z]> then
begin
add(num[i,j,k],num[x,y,z],);
add(num[x,y,z],num[i,j,k],);
inc(sum);
end;
end;
sum:=sum div +n*n*n;
writeln(sum-sap);
end.
bzoj1976的更多相关文章
- 【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
1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 832 Solved: 281[Submi ...
- 【BZOJ1976】能量魔方 [最小割]
能量魔方 Time Limit: 10 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description 小C 有一个能量魔方,这个魔方可神奇 ...
- 【bzoj1976】[BeiJing2010组队]能量魔方 Cube 网络流最小割
题目描述 一个n*n*n的立方体,每个位置为0或1.有些位置已经确定,还有一些需要待填入.问最后可以得到的 相邻且填入的数不同的点对 的数目最大. 输入 第一行包含一个数N,表示魔方的大小. 接下来 ...
- 二分图&网络流&最小割等问题的总结
二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...
随机推荐
- android API文档查询---context、toast、SharedPreferences
/*查阅api ---context1.abstract AssetManager getAssets() Returns an AssetManager instance for the a ...
- hdu 1715 大菲波数(高精度数)
Problem Description Fibonacci数列,定义如下: f(1)=f(2)=1 f(n)=f(n-1)+f(n-2) n>=3. 计算第n项Fibonacci数值. Inpu ...
- sgu 109 Magic of David Copperfield II
这个题意一开始没弄明白,后来看的题解才知道这道题是怎么回事,这道题要是自己想难度很大…… 你一开始位于(1,1)这个点,你可以走k步,n <= k < 300,由于你是随机的走的, 所以你 ...
- 九度OJ1198 a+b 【高精度整数】
题目地址:http://ac.jobdu.com/problem.php?pid=1198 题目描述: 实现一个加法器,使其能够输出a+b的值. 输入: 输入包括两个数a和b,其中a和b的位数不超过1 ...
- 基于bootstrap3的 表格和分页的插件
如题 样式呢就是bootstrap3 的 功能呢就是实现表格和分页 (以上废话) 本来是自己没事儿写的一个js插件,曾经搁浅了一阵子,但最近由于公司项目的原因也需要这样的一个插件,所以就捡起来做了个可 ...
- 动态获取爱奇艺上传视频mp4格式url地址
有时候,在工作中有些客户需要用到视频,我们大家都知道视频是非常的耗费流量的,因此,如果因为项目要求客户单独买台视频服务器是非常划不来的.那么将视频上传到优酷,爱奇艺等视频网站来托管那是一件很好的解决方 ...
- rsync与inotify 数据同步
发布:thebaby 来源:脚本学堂 [大 中 小] 本文介绍下,在linux系统中,使用rsync与inotify实现数据同步的一个实例,有研究文件同步的朋友可以作个参考.本文转自:ht ...
- GPS坐标转百度地图并且加载地图示例.支持微信端访问
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Wx_VehicleLoca ...
- [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】
题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...
- Dynamic Programming (DP) 问题总结
所有的 DP 问题都可以简单得用 Recursion 的方式实现.这通常是最容易想到的思路. 问题是这种实现不够 efficient,存在 subproblem 被重复计算的情况.有两种解决这个问题的 ...