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

切糕

切糕

首先,我们需要为每个点确定一个 \(1\)\(k\) 的权值,这可以用以下的最小割模型描述:

graph (19)

接下来我们以 \(z=4\)\(x' = x + 1\) 为例,找到描述第二个条件的方法。

graph (20)

先假设 \(S=0\),考虑如何找到对应的连边方法。

我们以断 \((1,2)\) 为例,容易发现下面的构造:

graph (21)

接下来考虑 \(S=1\),找到对应的连边。

graph (22)

你发现将所有边补充完整之后,这个图形如:

graph (23)

也就是说,我们会建立 \(O(nmk)\) 个点和 \(O(nmk)\) 条边,接下来跑最大流即可。

//Ad astra per aspera
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const long long INF=0x3f3f3f3f3f3f3f3f;
int n,s,t,from[648000],to[648000],nxt[648000],head[66666],edge_tot;
long long cap[648000];
void add_edge(int u,int v,long long w){from[edge_tot]=u;to[edge_tot]=v;cap[edge_tot]=w;nxt[edge_tot]=head[u];head[u]=edge_tot;edge_tot++;
}
void add(int u,int v,long long w){add_edge(u,v,w);add_edge(v,u,0); 
}
int cur[66666],level[66666];
bool bfs(){for(int i=1;i<=n;i++){level[i]=-1;}queue<int> q;level[s]=0;q.push(s);while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];~i;i=nxt[i]){int v=to[i];if(cap[i]  &&  level[v]==-1){level[v]=level[u]+1;q.push(v);}}}return level[t]!=-1;
}
long long dfs(int u,long long flow){if(u==t  ||  flow==0){return flow;}long long ans=0;for(int i=cur[u];~i;i=nxt[i]){cur[u]=i;int v=to[i];if(cap[i]  &&  level[v]==level[u]+1){long long res=dfs(v,min(flow,cap[i]));ans+=res;flow-=res;cap[i]-=res;cap[i^1]+=res;if(flow==0){break;}}}return ans;
}
long long Dinic(){long long max_flow=0;while(bfs()){for(int i=1;i<=n;i++){cur[i]=head[i];}max_flow+=dfs(s,INF);}return max_flow;
}
long long W[50][50][50],new_id[50][50][50];
int main(){memset(head,-1,sizeof(head));memset(nxt,-1,sizeof(nxt));int N,M,K;scanf("%d %d %d",&N,&M,&K);int S;scanf("%d",&S);s=++n;t=++n;for(int z=1;z<=K;z++){for(int x=1;x<=N;x++){for(int y=1;y<=M;y++){scanf("%lld",&W[x][y][z]);}}}for(int x=1;x<=N;x++){for(int y=1;y<=M;y++){for(int z=0;z<=K;z++){new_id[x][y][z]=++n;}add(s,new_id[x][y][0],INF);add(new_id[x][y][K],t,INF);for(int z=1;z<=K;z++){add(new_id[x][y][z-1],new_id[x][y][z],W[x][y][z]);}}}for(int x=1;x<N;x++){for(int y=1;y<=M;y++){for(int i=S;i<=K;i++){add(new_id[x][y][i],new_id[x+1][y][i-S],INF);add(new_id[x+1][y][i],new_id[x][y][i-S],INF);}}}for(int x=1;x<=N;x++){for(int y=1;y<M;y++){for(int i=S;i<=K;i++){add(new_id[x][y][i],new_id[x][y+1][i-S],INF);add(new_id[x][y+1][i],new_id[x][y][i-S],INF);}}}printf("%lld",Dinic());return 0;
}
http://www.jsqmd.com/news/516706/

相关文章:

  • Python力引导图优化实践:从基础实现到性能提升
  • 微信图片.dat文件解密实战:用Python一键转PNG(附完整代码)
  • SecGPT-14B多场景落地:DevSecOps流水线嵌入、CI/CD安全门禁策略生成
  • 讲讲甘肃靠谱的太阳能板厂家,程浩新能源适配山地安装吗? - 工业品网
  • MATLAB/Simulink仿真:能量互联直流微电网并网运行,包含PV Boost、充电桩、...
  • 嵌入式Linux系统移植:Bootloader、内核与根文件系统全栈实践
  • PCF2129实时时钟芯片驱动开发与高精度RTC工程实践
  • 基于STM32F103+FreeRTOS的扫地机器人工程框架(简化版)
  • YOLOv8实战:USB摄像头实时检测与图像采集一体化方案
  • ARM架构下内核NULL指针解引用问题深度解析与修复实践
  • java毕业设计基于springboot的诗词管理系统820
  • 天虹购物卡回收攻略,轻松变现金! - 团团收购物卡回收
  • Unity中UI、3D与特效层级管理的三大实战技巧
  • ESP32+MAX30102血氧监测实战:从硬件连接到阿里云物联网平台数据可视化
  • FPGA新手避坑指南:在Vivado里用PLL IP核生成多路时钟(附仿真波形对比)
  • 基于STM32的轻量化农业物联网终端设计
  • 毕设程序java智慧展馆系统 基于SpringBoot的数字化展馆信息管理平台 Java博物馆智能服务与藏品管理系统
  • 从SAR信号到洪涝地图:基于Sentinel-1数据的水体快速提取实战
  • GLM-4V-9B功能体验:上传图片实时对话,中英文混合提问全支持
  • 实战指南:使用EasyExcel实现动态数据与图片填充的高效导出
  • Android Studio 2023集成ZXing 3.5.3避坑指南:从下载到竖屏适配全流程
  • ACS SPiiPlus运动控制器实战:从零开始配置多轴同步控制(含代码示例)
  • 华大HC32F460:巧用Flash模拟EEPROM实现安全数据存储
  • RBD_Threshold库:嵌入式系统中的动态分位阈值处理
  • 【嵌入式C语言代码健壮性诊断指南】:20年资深工程师揭秘3类高频内存越界漏洞及静态分析实战方案
  • 面向未来的能力建构:现代物流专业学生职业发展路径与资质规划研究
  • LeaderLine避坑指南:从连线闪烁到滚动卡顿的5个常见问题解决方案
  • Qwen3.5-9B真实案例:建筑施工图→材料清单→预算估算生成
  • 2026年深圳防水公司口碑排名,水固仕新材料技术(深圳)公司口碑咋样 - 工业品牌热点
  • 奋飞咨询刘霞老师助力丽江制药企业荣获Ecovadis铜牌 - 奋飞咨询ecovadis