bzoj3144 [Hnoi2013]切糕
来源:互联网 发布:饿了么商家版for mac 编辑:程序博客网 时间:2024/04/25 21:48
题目链接:bzoj3144
题目大意:
相当于给规模为
题解:
最小割
一个我不知道的最小割经典模型
1. 对于每个点只能选一个高度,那么就把同一个位置上的不同高度依次连下来连成一条链,边权就是末端点的点权。最上层的点连S,最下层的点连T。每条链都要割一下,就相当于把点定为那个高度。
2. 又要求相邻点的高度差不超过
于是这样就搞定了。
#include<cstdio>#include<cstdlib>#include<cstring>#include<queue>#include<iostream>#include<algorithm>using namespace std;#define maxn 101000const int inf=0x7fffffff;struct node{ int y,c,next,ot;}a[maxn*12];int len,first[maxn];int num[45][45][45],S,T;void ins(int x,int y,int c){ len++;int n1=len;a[len].y=y;a[len].c=c; a[len].next=first[x];first[x]=len; len++;int n2=len;a[len].y=x;a[len].c=0; a[len].next=first[y];first[y]=len; a[n1].ot=n2;a[n2].ot=n1;}queue<int > q;bool vis[maxn];int d[maxn];int mymin(int x,int y){return (x<y)?x:y;}bool bfs(){ for (int i=1;i<=T;i++) d[i]=-1; vis[S]=true;d[S]=0;q.push(S); while (!q.empty()) { int x=q.front();q.pop(); for (int k=first[x];k!=-1;k=a[k].next) { int y=a[k].y; if (a[k].c>0 && d[y]==-1) { d[y]=d[x]+1; if (!vis[y]) { q.push(y); vis[y]=true; } } }vis[x]=false; } return d[T]!=-1;}int dfs(int x,int flow){ if (x==T) return flow; int delta=0; for (int k=first[x];k!=-1;k=a[k].next) { int y=a[k].y; if (a[k].c<=0) continue; if (d[y]==d[x]+1) { int minf=mymin(a[k].c,flow-delta); minf=dfs(y,minf); delta+=minf; a[k].c-=minf; a[a[k].ot].c+=minf; if (delta==flow) break; } }if (delta==0) d[x]=-1; return delta;}int dinic(){ int ret=0; while (bfs()) ret+=dfs(S,inf); return ret;}int main(){ //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); int p,q,r,i,j,k,x,cnt,D; scanf("%d%d%d",&p,&q,&r); scanf("%d",&D);cnt=len=0; memset(first,-1,sizeof(first)); for (i=1;i<=r;i++) for (j=1;j<=p;j++) for (k=1;k<=q;k++) num[i][j][k]=++cnt; S=cnt+1;T=S+1; for (i=1;i<=p;i++) for (j=1;j<=q;j++) ins(num[r][i][j],T,inf); for (k=1;k<=r;k++) for (i=1;i<=p;i++) for (j=1;j<=q;j++) { scanf("%d",&x); if (k!=1) ins(num[k-1][i][j],num[k][i][j],x); else ins(S,num[1][i][j],x); if (k>=D) { if (i>1) ins(num[k][i][j],num[k-D][i-1][j],inf); if (i<p) ins(num[k][i][j],num[k-D][i+1][j],inf); if (j>1) ins(num[k][i][j],num[k-D][i][j-1],inf); if (j<q) ins(num[k][i][j],num[k-D][i][j+1],inf); } } printf("%d\n",dinic()); return 0;}
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最小割
- hadoop streaming python 处理 lzo 文件遇到的问题
- 1139: 输出最短字符串
- docker 安装部署及常用命令
- 第六周leetcode题
- C#基础-继承、多态与接口
- bzoj3144 [Hnoi2013]切糕
- elasticsearch单个索引添加字段
- CDOJ 31 饭卡(card)及HDOJ 2546 饭卡
- 截获室友的梦话
- 《c++primer》笔记 第1章 开始
- C#特性详解
- 蓝桥 灾后重建
- 《剑指Offer》 二进制中1的个数
- 第1天:从计算机结构到汇编程序入门