BZOJ 3144 网络流最小割 解题报告
来源:互联网 发布:淘宝u站中心 编辑:程序博客网 时间:2024/06/06 11:56
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 Output
6
[解题报告]
比较详细的题解
http://blog.csdn.net/zarxdy34/article/details/45272055
代码如下:
#include<cstdio>#include<cstring> #include<string>#include<algorithm>#include<map>#include<queue> #include<vector>using namespace std; #define inf 0x3f3f3f3f #define maxv 52000#define maxe 520000int nume=0,head[maxv],e[maxe][3];void inline adde(int i,int j,int c) { e[nume][0]=j;e[nume][1]=head[i];head[i]=nume; e[nume++][2]=c; e[nume][0]=i;e[nume][1]=head[j];head[j]=nume; e[nume++][2]=0; } int ss,tt,n,m; int vis[maxv],lev[maxv]; bool bfs() { for(int i=0;i<maxv;i++) vis[i]=lev[i]=0; queue<int>q; q.push(ss); vis[ss]=1; while(!q.empty()) { int cur=q.front(); q.pop(); for(int i=head[cur];i!=-1;i=e[i][1]) { int v=e[i][0]; if(!vis[v]&&e[i][2]>0) { lev[v]=lev[cur]+1; vis[v]=1; q.push(v); } } } return vis[tt]; } int dfs(int u,int minf) { if(u==tt||minf==0) return minf; int sumf=0,f; for(int i=head[u];i!=-1&&minf;i=e[i][1]) { int v=e[i][0]; if(lev[v]==lev[u]+1&&e[i][2]>0) { f=dfs(v,minf<e[i][2]?minf:e[i][2]); e[i][2]-=f;e[i^1][2]+=f; sumf+=f;minf-=f; } } if(!sumf) lev[u]=-1; return sumf; } int Dinic() { int sum=0; while(bfs()) sum+=dfs(ss,inf); return sum; } int p,q,r,d;int mp[50][50][50];int mov[4][2]={{0,1},{1,0},{0,-1},{-1,0}};int main(){ nume=0; memset(head,-1,sizeof(head)); scanf("%d%d%d%d",&p,&q,&r,&d); int cnt=0;ss=++cnt; for(int i=1;i<=r+1;++i) for(int j=1;j<=p;++j) for(int k=1;k<=q;++k) mp[i][j][k]=++cnt; tt=++cnt; for(int i=1;i<=r;++i) for(int j=1;j<=p;++j) for(int k=1;k<=q;++k) { int x;scanf("%d",&x); adde(mp[i][j][k],mp[i+1][j][k],x); } for(int i=1;i<=p;++i) for(int j=1;j<=q;++j) { adde(ss,mp[1][i][j],inf); adde(mp[r+1][i][j],tt,inf); } for (int i=d+1;i<=r+1;i++) for (int j=1;j<=p;j++) for (int k=1;k<=q;k++) for (int mv=0;mv<4;mv++) if (mp[i][j+mov[mv][0]][k+mov[mv][1]]) adde(mp[i][j][k],mp[i-d][j+mov[mv][0]][k+mov[mv][1]],inf); printf("%d\n",Dinic()); return 0;}
阅读全文
0 0
- BZOJ 3144 网络流最小割 解题报告
- BZOJ 3894 网络流最小割 解题报告
- BZOJ 1001 网络流最小割 解题报告
- bzoj 3144 切糕 最小割 解题报告
- BZOJ 3894 文理分科 解题报告 最小割 网络流 DINIC
- BZOJ 1475 最小割 解题报告
- CodeVS 1907 网络流最小割 解题报告
- HOJ 2634 网络流最小割 解题报告
- URAL 1277 网络流最小割 解题报告
- SPOJ 1693 网络流最小割 解题报告
- BZOJ 2400(网络流最小割)
- BZOJ 2561 最小生成树 网络流 最小割
- Codeforces 808F 网络流最小割(二分图最大点权独立集) 解题报告
- Bzoj:1324:Exca王者之剑:网络流,最小割
- bzoj 2229: [Zjoi2011]最小割 分治&网络流
- [BZOJ]1797: [Ahoi2009]Mincut 最小割 网络流+强连通
- 切糕(经典网络流最小割) CODEVS 2997 BZOJ 3144
- 网络流 最小割
- Android中的Button按钮
- 过程与行为,资源与工具
- JParticles 2.0 发布,打造炫酷的粒子特效
- 执行ping操作的时候发生了什么?
- 鲁棒性
- BZOJ 3144 网络流最小割 解题报告
- 知识图谱初探
- C#中的接口实现多态
- 二叉搜索树的局限性
- 在做《第一行代码》ListViewTest实验时出现以下错误:
- 从高考到程序员
- JAVA中内存分配
- TensorFlow运行错误,AttributeError: module 'pandas' has no attribute 'computation'
- boost -- program_options