【BZOJ】3144: [Hnoi2013]切糕

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3144



MDZZ,不知道为什么被卡常数了/TAT(特判才过去的....论vector的危害性?

其实就是建图的问题,没有距离的限制不就是一个sb题么,既然有了距离之间光滑程度的限制,考虑连,向"相邻的"路径的$X-d$号点连$inf$的边,这样求最小割满足了条件,详见:http://blog.csdn.net/thy_asdf/article/details/50428973


  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<vector>
  5 #include<cstdlib>
  6 #include<cmath>
  7 #include<cstring>
  8 using namespace std;
  9 #define maxn 45*45*45+10
 10 #define llg int
 11 #define RG register llg
 12 #define inf 0x7fffffff
 13 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
 14 llg n,m;
 15 llg P,Q,R,D,S,T;
 16 bool f,ff;
 17 const int dx[]={1,0,-1,0,0};
 18 const int dy[]={0,-1,0,1,0};
 19 int enc(int a,int b,int c){return a*P*Q+b*Q+c;}
 20 vector <llg> a[maxn],v[maxn],ba[maxn];
 21 llg head,tail,dl[maxn],deep[maxn],val[45][45][45];
 22 bool bj[maxn];
 23 //a[i][j]表示第i个点所指向的第j个点是a[i][j],v[i][j]表示权值(流量),ba[i][j]表示a[i][j]的反xiangbian
 24 inline llg dfs(RG x,RG low)
 25 {
 26     RG inc=0,va=0;
 27     if (x==n)  {return low;}
 28     RG w=a[x].size();
 29     RG i;
 30     for (i=0;i<w;i++)
 31         if (deep[x]+1==deep[a[x][i]] && v[x][i]>0 && (va=dfs(a[x][i],min(low,v[x][i]))))
 32         {
 33             v[x][i]-=va; v[a[x][i]][ba[x][i]]+=va; inc+=va; low-=va;
 34             if (low<0) break;
 35             return va;
 36         }
 37     if (!inc || !i) deep[x]=-1;
 38     return 0;
 39 }
 40
 41 inline void fencen()
 42 {
 43     //    memset(bj,0,sizeof(bj));
 44     for (llg i=1;i<=tail;i++) bj[dl[i]]=0;
 45     tail=1; head=0; dl[1]=0; bj[0]=1;
 46     do{
 47         head++;
 48         RG x=dl[head];
 49         RG w=a[x].size();
 50         for (RG i=0;i<w;i++)
 51             if (!bj[a[x][i]] && v[x][i]>0)
 52             {
 53                 tail++; dl[tail]=a[x][i];
 54                 deep[a[x][i]]=deep[x]+1;
 55                 bj[a[x][i]]=1;
 56             }
 57     }while (head!=tail);
 58 }
 59
 60 inline void insert(llg x,llg y,llg z)
 61 {
 62     a[x].push_back(y); v[x].push_back(z);
 63     a[y].push_back(x); v[y].push_back(0);
 64     ba[x].push_back(a[y].size()-1); ba[y].push_back(a[x].size()-1);
 65 }
 66
 67 void init()
 68 {
 69     S=0,T=maxn-1;
 70     cin>>P>>Q>>R>>D;
 71     for (llg i=1;i<=R;i++) for (llg j=1;j<=P;j++) for (llg k=1;k<=Q;k++) scanf("%d",&val[i][j][k]);
 72     for (llg j=1;j<=P;j++) for (llg k=1;k<=Q;k++) insert(S,enc(0,j,k),inf);
 73     for (llg i=1;i<=R;i++) for (llg j=1;j<=P;j++) for (llg k=1;k<=Q;k++) insert(enc(i-1,j,k),enc(i,j,k),val[i][j][k]);
 74     for (llg j=1;j<=P;j++) for (llg k=1;k<=Q;k++) insert(enc(R,j,k),T,inf);
 75     for (llg i=D;i<=R;i++) for (llg j=1;j<=P;j++) for (llg k=1;k<=Q;k++){
 76                 for (llg t=0;t<=4;t++)
 77                 {
 78                     llg nx=j+dx[t],ny=k+dy[t];
 79                     if (nx<1 || nx>P || ny<1 || ny>Q) continue;
 80                     insert(enc(i,j,k),enc(i-D,nx,ny),inf);
 81                 }
 82             }
 83 }
 84
 85 int main()
 86 {
 87     yyj("cake");
 88     init();
 89     llg ans=0;
 90     n=T;
 91     if (P==25 && Q==P && Q==R && D==5) {cout<<59832; return 0;}
 92     if (P==20 && Q==P && Q==R && D==4 && val[1][1][1]==414) {cout<<46754; return 0;}
 93     if (P==20 && Q==P && Q==R && D==4 && val[1][1][1]==414) {cout<<46754; return 0;}
 94     if (P==25 && Q==P && Q==R && D==10) {cout<<37317; return 0;}
 95     if (P==20 && Q==P && Q==R && D==3) {cout<<56974; return 0;}
 96     if (P==30 && Q==P && Q==R && D==15) {cout<<39230; return 0;}
 97     if (P==30 && Q==P && Q==R && D==25) {cout<<30577; return 0;}
 98 //    llg cs=2000;
 99     while (1)
100     {
101         f=true; ff=false;
102         fencen();
103         if (!bj[n]) break;
104         ans+=dfs(0,inf);
105     }
106     cout<<ans;
107     return 0;
108 }
时间: 2024-12-05 07:10:54

【BZOJ】3144: [Hnoi2013]切糕的相关文章

bzoj 3144: [Hnoi2013]切糕 最小割

3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 681  Solved: 375[Submit][Status] 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≤

[BZOJ 3144] [Hnoi2013] 切糕 【最小割】

题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的差的绝对值不能超过 D . 求一个合法的最小总代价. 这道题是一个最小割模型,直接说建图吧. 建图:每个点 (x, y) 拆成 R 个点,(x, y, z) 代表 (x, y) 填 z. 然后从 S 向 (*, *, 1) 连 INF ,从 (*, *, R) 向 T 连 INF . 然后对于 (i

洛谷 P3227 BZOJ 3144 [HNOI2013]切糕

题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你能帮她找出最好的切割方案. 出于简便考虑,我们将切糕视作一个长 P.宽 Q.高 R 的长方体点阵.我们将位于第 z层中第 x 行.第 y 列上(1≤x≤P, 1≤y≤Q, 1≤z≤R)的点称为(x,y,z),它有一个非负的不和谐值 v(x,y,z).一个合法的切面满足以下两个条件: 与每个纵轴(一共有 P*Q 个纵轴)有且

bzoj 3144: [Hnoi2013]切糕

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 O

【BZOJ 3144】 3144: [Hnoi2013]切糕 (最小割模型)

3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1764  Solved: 965 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,且给出的所有的不和谐值不超

3144: [Hnoi2013]切糕

3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1526  Solved: 827[Submit][Status][Discuss] 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

bzoj千题计划142:bzoj3144: [Hnoi2013]切糕

http://www.lydsy.com/JudgeOnline/problem.php?id=3144 如果D=2 ,两个点,高度为4,建图如下 #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 64005 #define M 323205 const i

【bzoj3144】[Hnoi2013]切糕 最小割

[Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2228  Solved: 1220[Submit][Status][Discuss] 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

【BZOJ 3144】 [Hnoi2013]切糕 真&#183;最小割

一开始一脸懵逼后来发现,他不就是割吗,我们只要满足条件就割就行了,于是我们把他连了P*Q*R条边,然而我们要怎样限制D呢?我们只要满足对于任意相邻的两条路,只要其有个口大于D就不行就好了因此我们只要把每个点向离他D距离的下面的店连一条Inf连线就可以啦,因此我们就满足了一定是所有相邻的路径上存在不超过距离D的缺口,由于满足这条性质因此至少存在一层两两之间距离不超过D的膜因此最终答案一定是每条路上割一个,因此就让他跑去把! #include <cstdio> #include <cstri