BZOJ3144: [Hnoi2013]切糕
来源:互联网 发布:万网域名登录网址 编辑:程序博客网 时间:2024/04/27 02:31
Description
Input
第一行是三个正整数P,Q,R,表示切糕的长P、 宽Q、高R。第二行有一个非负整数D,表示光滑性要求。接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤P, 1≤y≤Q, 1≤z≤R)。
100%的数据满足P,Q,R≤40,0≤D≤R,且给出的所有的不和谐值不超过1000。
Output
仅包含一个整数,表示在合法基础上最小的总不和谐值。
Sample Input
2 2 2
1
6 1
6 1
2 6
2 6
1
6 1
6 1
2 6
2 6
Sample Output
6
HINT
最佳切面的f为f(1,1)=f(2,1)=2,f(1,2)=f(2,2)=1
Source
最小割模型
题目完全考文言文啊
简洁版题意 给一个矩阵 每个位置值域(1,h) 每个位置选每个数代价不同 相邻格子的数差<=d 求最小代价
看我连边就行了 显然正确
(k,i,j)向(k+1,i,j)连v(k+1,i,j)的边
向相邻的格子(k-d,x,y)连inf的边
#include<bits/stdc++.h>using namespace std;const int maxn = 100010;const int maxm = 1000020;const int inf = 1e9;int ans,S,T;int cnt=1,n,m;int cur[maxn],head[maxn],q[maxn],dis[maxn];struct edge{int to,nxt;int flow;} e[maxm];inline void addedge(int x,int y,int fl){e[++cnt].to=y;e[cnt].nxt=head[x];head[x]=cnt;e[cnt].flow=fl;e[++cnt].to=x;e[cnt].nxt=head[y];head[y]=cnt;e[cnt].flow=0;}inline bool bfs(){int ql=0,qr=1;q[1]=S;memset(dis,0,sizeof(dis));dis[S]=1;while(ql<qr){int x=q[++ql];for(int i=head[x]; i; i=e[i].nxt){int y=e[i].to;if(e[i].flow&&!dis[y]){dis[y]=dis[x]+1;q[++qr]=y;}}}if(dis[T]) return true;return false;}inline int dfs(int x,int flow){if(x==T) return flow;int d,used=0;for(int &i=cur[x]; i; i=e[i].nxt){int y=e[i].to;if(e[i].flow&&dis[y]==dis[x]+1){d=dfs(y,min(flow-used,e[i].flow));e[i].flow-=d;e[i^1].flow+=d;used+=d;if(used==flow)return flow;}}if(!used)dis[x]=-1;return used;}inline void dinic(){while(bfs()){for(int i=S; i<=T; i++)cur[i]=head[i];ans+=dfs(S,inf);}}int id[41][41][41],v[41][41][41],r,c,h,tot,d;int dx[]={0,1,-1,0,0},dy[]={0,0,0,1,-1};int main(){scanf("%d%d%d%d",&r,&c,&h,&d);for( int i = 1 ; i <= h ; i++ )for( int j = 1 ; j <= r ; j++ )for( int k = 1 ; k <= c ; k ++ )id[ i ][ j ][ k ] = ++tot,scanf("%d",&v[ i ][ j ][ k ]);T = tot + 1;for( int i = 1 ; i <= r ; i++ )for( int j = 1 ; j <= c ; j++ ){for( int k = 1 ; k <= h ; k++ ){addedge(id[ k - 1 ][ i ][ j ],id[ k ][ i ][ j ],v[ k ][ i ][ j ]);if( k > d )for( int u = 1 ; u <= 4 ; u++ ){int x = i + dx[ u ], y = j + dy[ u ];if( x < 1 || y < 1 || x > r || y > c ) continue;addedge(id[ k ][ i ][ j ],id[ k - d ][ x ][ y ],inf);}}addedge(id[ h ][ i ][ j ],T,inf);}dinic();cout << ans << endl;}
0 0
- BZOJ3144【HNOI2013】切糕
- bzoj3144: [Hnoi2013]切糕
- bzoj3144【HNOI2013】切糕
- [BZOJ3144][HNOI2013]切糕
- [bzoj3144]【HNOI2013】切糕
- BZOJ3144: [Hnoi2013]切糕
- BZOJ3144: [Hnoi2013]切糕
- BZOJ3144: [Hnoi2013]切糕
- [题解]bzoj3144(HNOI2013)切糕
- 【bzoj3144】[Hnoi2013]切糕
- bzoj3144 [Hnoi2013]切糕
- 【bzoj3144】[Hnoi2013]切糕
- bzoj3144 [Hnoi2013]切糕
- 【bzoj3144】【HNOI2013】【切糕】【最小割】
- 【BZOJ3144】[Hnoi2013]切糕【最小割】
- [BZOJ3144][HNOI2013]切糕-网络流
- [BZOJ3144][HNOI2013]切糕 最小割
- bzoj3144: [Hnoi2013]切糕 DINIC最小割
- HDU - 1863 畅通工程
- CentOs 6.5安装apache 安装php 安装mysql
- windows查看端口占用情况
- spark-2.0.2变动
- spring 注解详解
- BZOJ3144: [Hnoi2013]切糕
- 机器人入门困惑之资料总结
- 第七天
- 第八天
- aotulayout适配可能会遇到的问题
- 学习python的第三十二天-列表,元组,字典
- H-Find them, Catch them POJ 1703
- 第九天
- 计算机专业导论简易思维导图