[BZOJ 3144] 切糕
Link:
Solution:
发现要把点集分成不连通的两部分,最小割的模型还是很明显的
首先我们将原图转化为$R+1$层,从而将点权化为边权
关键还是在于建图是怎么保证$|h_i-h_j|<=D$这个条件
要保证$|h_i-h_j|<=D$这个条件也就意味着选了$i$就不能选$j$,但仍然要保证$i->j$的连通性
于是我们由$i+D$向$i$连一条边权为$INF$的边,
这样如果割掉$i,j(j>i+D)$但不选择它们之间的边,就不会影响ST的连通性
只能再割掉$INF$边或其他边,这样两边同时选择明显不会计入答案
同时$i,j(j<=i+D)$就不会出现这样的问题,于是通过设置$INF$边就解决了这个问题
如上图,如果仅割掉右侧绿边和左侧红边,中间黑色的$INF$边仍会保持ST的连通性
Code:
#include <bits/stdc++.h> using namespace std; const int MAXN=**;
const int INF=;
int P,Q,R,D,S,T,id[][][],iter[MAXN],level[MAXN],cnt=,x;
int dx[]={,,,-},dy[]={,-,,};
struct edge
{
int to,cap,rev;
};
vector<edge> G[MAXN]; void add_edge(int from,int to,int cap)
{
G[from].push_back(edge{to,cap,G[to].size()});
G[to].push_back(edge{from,,G[from].size()-});
} bool bfs()
{
memset(level,-,sizeof(level));
queue<int> que;que.push(S);level[S]=;
while(!que.empty())
{
int v=que.front();que.pop();
for(int i=;i<G[v].size();i++)
{
edge &e=G[v][i];
if(e.cap && level[e.to]==-)
level[e.to]=level[v]+,que.push(e.to);
}
}
return (level[T]>);
} int dfs(int v,int f)
{
if(v==T) return f;
for(int &i=iter[v];i<G[v].size();i++)
{
edge &e=G[v][i];
if(level[e.to]==level[v]+ && e.cap)
{
int d=dfs(e.to,min(f,e.cap));
if(d)
{
e.cap-=d;G[e.to][e.rev].cap+=d;
return d;
}
}
}
return ;
} int Dinic()
{
int ret=;
while(bfs())
{
memset(iter,,sizeof(iter));
int f;
while((f=dfs(S,INF))>) ret+=f;
}
return ret;
} int main()
{
scanf("%d%d%d%d",&P,&Q,&R,&D);
S=;
for(int i=;i<=R+;i++) for(int j=;j<=P;j++) for(int k=;k<=Q;k++) //预处理出编号
id[i][j][k]=++cnt;
T=++cnt; for(int i=;i<=R;i++) for(int j=;j<=P;j++) for(int k=;k<=Q;k++)
scanf("%d",&x),add_edge(id[i][j][k],id[i+][j][k],x); for(int i=;i<=P;i++) for(int j=;j<=Q;j++)
add_edge(S,id[][i][j],INF),add_edge(id[R+][i][j],T,INF); for(int i=D+;i<=R+;i++) for(int j=;j<=P;j++) for(int k=;k<=Q;k++)
for(int dir=;dir<;dir++)
{
int fx=j+dx[dir],fy=k+dy[dir];
if(!id[i-D][fx][fy]) continue;
add_edge(id[i][j][k],id[i-D][fx][fy],INF);
} printf("%d",Dinic());
return ;
}
Review:
1、认真审题,不要主观带入
这题一开始想成了切割线必须在同一个平面,还是不能读题时自己想当然啊
2、最小割模型的新套路
最小割的重点便在于割边计入答案
如果不想让两条边同时计入答案,可以在它们之间加入一条$INF$边,
保证同时选择两边时不会影响原图ST的连通性且$INF$边不会影响结果
使得同时选择两边时一定不符合最小的条件,从而不会计入答案
3、点权变边权
可以通过点变边,边变点的方式完成这样的转换
[BZOJ 3144] 切糕的更多相关文章
- BZOJ 3144 切糕(最小割)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3144 题意: 思路:我们假设没有那个D的限制.这样就简 单了.贪心的话,我们只要在每一个 ...
- bzoj 3144 切糕 —— 最小割
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3144 每个点拆成 R 个,连成一条链,边上是权值,割掉代表选这一层: 然后每个点的第 t 层 ...
- BZOJ 3144 切糕 最小割
题意: 一个矩阵,每个格子分配一个数,不同的数字,代价不同,要求相邻格子数字差小等于d 求最小代价. 分析: 我猜肯定有人看题目就想到最小割了,然后一看题面理科否决了自己的这个想法…… 没错,就是最小 ...
- [BZOJ 3144][HNOI 2013] 切糕
题目大意 切糕是 (p times q times r) 的长方体,每个点有一个违和感 (v_{x, y, z}).先要水平切开切糕(即对于每个纵轴,切面与其有且只有一个交点),要求水平上相邻两点的切 ...
- [BZOJ 3144] [Hnoi2013] 切糕 【最小割】
题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...
- BZOJ 3144: [Hnoi2013]切糕
3144: [Hnoi2013]切糕 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1495 Solved: 819[Submit][Status] ...
- bzoj 3144: [Hnoi2013]切糕 最小割
3144: [Hnoi2013]切糕 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 681 Solved: 375[Submit][Status] ...
- 【BZOJ 3144】 3144: [Hnoi2013]切糕 (最小割模型)
3144: [Hnoi2013]切糕 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1764 Solved: 965 Description Inp ...
- BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)
题面:洛谷传送门 BZOJ传送门 最大流神题 把点权转化为边权,切糕里每个点$(i,j,k)$向$(i,j,k+1)$连一条流量为$v(i,j,k)$的边 源点$S$向第$1$层的点连边,第$R+1$ ...
随机推荐
- [BZOJ3829][Poi2014]FarmCraft 贪心
这个题应该是很容易想到贪心的,只要可是怎么贪才是科学的呢?我们分析一下题干,对于每个边只能一进一出因此,对于树上的一棵子树,我们只要一进子树就必须遍历完,因此我们只能进行一遍 dfs() 然后我们发现 ...
- Codeforces Round #526 (Div. 2) E. The Fair Nut and Strings
E. The Fair Nut and Strings 题目链接:https://codeforces.com/contest/1084/problem/E 题意: 输入n,k,k代表一共有长度为n的 ...
- intellij IDEA与springboot项目建立
概念问题: IntelliJ系中的Project相当于Eclipse系中的workspace.IntelliJ系中的Module相当于Eclipse系中的Project.IntelliJ中一个Proj ...
- shell监控进程是否存在
1.直接给代码:我这个是两个程序.多半要写成函数 [root@java1 src]# cat checkprocess.sh #!/bin/bashcheckprocess(){ps -ef|grep ...
- 获取系统内RAR安装路径
RegistryKey the_Reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVers ...
- Docker Community Edition for CentOS
Docker CE for CentOS Docker CE for CentOS distribution is the best way to install the Docker platfor ...
- Windows下查看某个端口被哪个服务占用
1.查看某个端口是否被占用 打开命令行,输入:netstat -ano | findstr "3306" 2.查看端口被哪个服务占用 tasklist | findstr “PID ...
- word使用宏 在文章中插入源代码进行排版
1.宏的代码如下. Sub 设置代码表格() ' author: code4101 ' 设置代码表格 宏 ' ' ' 背景色为morning的配色方案,RGB为(229,229,229) ) With ...
- NodeJS概述
NodeJS中文API 一.概述 Node.js 是一种建立在Google Chrome’s v8 engine上的 non-blocking (非阻塞), event-driven (基于事件的) ...
- 转:Nginx国人开发缩略图模块(ngx_image_thumb)
ngx_image_thumb是nginx中用来生成缩略图的模块,生存缩略图的方法很多,之前也写过一篇 <nginx生成缩略图配置>,在github上发现国人开发的一款模块,作者的文档写的 ...