当前位置: 首页 > news >正文

P3227 [HNOI2013] 切糕

题意:
n ∗ m n*m nm的矩阵,每个点可以选择一个值 a i , j = k a_{i,j}=k ai,j=k,然后你能获得 w ( i , j , k ) w(i,j,k) w(i,j,k)的得分,但是相邻两点之间的差值有限制,让你求最大得分。

考虑最小割。

每个点 ( i , j ) (i,j) (i,j)弄出一条长为 R + 1 R+1 R+1的链,其中 k − > k + 1 k -> k+1 k>k+1的流量为 w ( i , j , k ) w(i,j,k) w(i,j,k)

考虑限制,只需要从这条链的 k k k到相邻一条链的 k − d k-d kd连一无穷大的边,因为如果相邻的链选择的点 < k − d <k-d <kd那么就会有流量剩余,因此就能进行限制了。

#include<bits/stdc++.h>
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define dwn(i,x,y) for(int i=x;i>=y;i--)
#define ll long long
using namespace std;
template<typename T>inline void qr(T &x){x=0;int f=0;char s=getchar();while(!isdigit(s))f|=s=='-',s=getchar();while(isdigit(s))x=x*10+s-48,s=getchar();x=f?-x:x;
}
int cc=0,buf[31];
template<typename T>inline void qw(T x){if(x<0)putchar('-'),x=-x;do{buf[++cc]=int(x%10);x/=10;}while(x);while(cc)putchar(buf[cc--]+'0');
}
const int N=5e5+10;
int n,m,k,d;
int h[N],st,ed,cur[N];
int tot=1,hd[N],ver[N*5],nxt[N*5],w[N*5];
int a[50][50][50],id[50][50][50],cnt;
void add(int x,int y,int z){tot++;ver[tot]=y;w[tot]=z;nxt[tot]=hd[x];hd[x]=tot;
}
void link(int x,int y,int z){add(x,y,z),add(y,x,0);
}
bool bt_h(){memset(h,0,sizeof(h));h[st]=1;queue<int>q;q.push(st);while(q.size()){int x=q.front();q.pop();for(int i=hd[x];i;i=nxt[i]){int y=ver[i];if(w[i]&&!h[y]){h[y]=h[x]+1;q.push(y);}}}return h[ed];
}
int findflow(int x,int f){if(x==ed)return f;int res=f,tt;for(int &i=cur[x];i;i=nxt[i]){int y=ver[i];if(w[i]&&h[y]==h[x]+1){tt=findflow(y,min(res,w[i]));w[i]-=tt,w[i^1]+=tt;res-=tt;if(!res)break;}}if(res==f)h[x]=0;return f-res;
}
int dicnic(){int ans=0;while(bt_h()){memcpy(cur,hd,sizeof(cur));ans+=findflow(st,1e9);}return ans;
}
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
void solve(){qr(n),qr(m),qr(k),qr(d);rep(ki,1,k){rep(i,1,n)rep(j,1,m)qr(a[ki][i][j]);}rep(ki,1,k+1){rep(i,1,n)rep(j,1,m)id[ki][i][j]=++cnt;}st=cnt+1,ed=st+1;rep(i,1,n)rep(j,1,m){link(st,id[1][i][j],1e7);link(id[k+1][i][j],ed,1e7);}rep(ki,1,k){rep(i,1,n)rep(j,1,m){link(id[ki][i][j],id[ki+1][i][j],a[ki][i][j]);}if(ki>d){rep(i,1,n)rep(j,1,m){rep(t,0,3){int x=i+dx[t],y=j+dy[t];if(1<=x&&x<=n&&1<=y&&y<=m){link(id[ki][i][j],id[ki-d][x][y],1e7);}}}}}qw(dicnic());puts("");
}
int main(){int tt;tt=1;while(tt--)solve();return 0;
}
http://www.lryc.cn/news/450975.html

相关文章:

  • 超分服务的分量保存
  • Windows11系统下SkyWalking环境搭建教程
  • 前端BOM常用操作
  • 【Go】-viper库的使用
  • JavaWeb酒店管理系统(详细版)
  • C++ | 定长内存池 | 对象池
  • python画图|自制渐变柱状图
  • 基于RPA+BERT的文档辅助“悦读”系统 | OPENAIGC开发者大赛高校组AI创作力奖
  • K8S部署流程
  • DevExpress WinForms中文教程:Data Grid - 如何添加或删除行?
  • u盘格式化后数据能恢复吗?2024年Top4恢复神器来帮忙
  • 深度学习·Argparse
  • 制造企业为何需要PLM系统?PLM系统解决方案对制造业重要性分析
  • http协议中的header详细讲解
  • 探索后量子安全:基于格加密技术的未来密码学展望
  • WPF之UI进阶--完整了解wpf的控件和布局容器及应用
  • unity一键注释日志和反注释日志
  • VBA数据库解决方案第十五讲:Recordset集合中单个数据的精确处理
  • 甄选范文“论软件需求管理”,软考高级论文,系统架构设计师论文
  • Android Studio Dolphin 中Gradle下载慢的解决方法
  • Excel实现省-市-区/县级联
  • 【优化代码结构】函数的参数归一化
  • CSS中height设置100vh和100%的区别
  • 红米k60至尊版工程固件 MTK芯片 资源预览 刷写说明 与nv损坏修复去除电阻图示
  • QEMU使用Qemu-Guest-Agent传输文件、执行指令等
  • 【漏洞复现】金和OA C6 GeneralXmlhttpPage.aspx Sql注入漏洞
  • 复数表示的电场
  • 常用快捷键整理
  • 【Transformer】长距离依赖
  • Git傻傻分不清楚(下)