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

Sample Output

6

HINT

最佳切面的ff(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
原创粉丝点击