[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$ ...
随机推荐
- 适用于实数范围的中缀表达式的 + - * / ( ) 计算(C++实现)
核心算法: mid=FormatMid(mid); //格式化中缀表达式 JudgeLegalMid(mid); //判断中缀表达式的合法性 MidToPost mtp(mid); mtp.ToPos ...
- Ecplise下设置jQuery和ExtJs自动提示
Spket 1.6.23下载: http://yunpan.cn/cjJYmEcMFIuuN 访问密码 5642 ext jsb下载:http://yunpan.cn/cjJYR7ZTzibQn ...
- [Python]安装完pip、pygame后,仍然import pygame报错
按照<python编程从入门到实践>上的教程下载了pygame的whl文件进行安装, 在cmd窗口里import pygame提示无错误,在IDEL里程序也能正常运行, 但是pycharm ...
- Springmvc 流程图
- 转:深入理解javascript原型和闭包系列
转自:深入理解javascript原型和闭包系列 从下面目录中可以看到,本系列有16篇文章,外加两篇后补的,一共18篇文章.写了半个月,从9月17号开始写的.每篇文章更新时,读者的反馈还是可以的,虽然 ...
- 01-UIDynamic简单演练demo源代码
源代码下载: 01-简单演练.zip72.0 KB // // ViewController.m // 01.简单演练 // // Created by apple on 13-12-24. / ...
- CSS3 文本效果(阴影)
CSS3中包含几个新的文本特征. 在本章中您将了解以下文本属性: text-shadow box-shadow text-overflow word-wrap word-break CSS3 的文本阴 ...
- Linux ALSA介绍
1. 介绍 ALSA(即Advanced Linux Sound Architecture), 是目前Linux的主流音频体系结构, 提供了音频和MIDI的支持, 其架构图如下所示 TIP: 笔者的代 ...
- Cause: org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: java.sql.SQLException: 不支持的特性
mybatis插入数据时报错: Cause: org.apache.ibatis.executor.ExecutorException: Error getting generated key or ...
- 《Java编程思想》笔记 第十四章 类型信息
1.RTTI:在运行时识别一个对象类型 JAVA在运行时 有时要 识别对象和类的信息这个机制叫RTTI.Java提供了两种机制去做这件事.传统的RTTI 和 反射. 传统的RTTI 假定编译时就已经 ...