点边转化:把每个格子 (i,j) 拆成一个入点一个出点。
详解链接:【图论技巧】点边转化(拆点和拆边)
从每个入点向对应的出点连两条有向边:一条容量为 1 ,费用为格子 (i,j) 中的数;
另一条容量为 k−1 ,费用为 0 。

从 (i,j) 的出点到 (i,j+1) 和 (i+1,j) 的入点连有向边,容量为 k ,费用为 0 。
以 (1,1) 的入点为源点, (n,n) 的出点为汇点,求最大费用最大流。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<math.h>
#include<cstring>
#include<queue>
//#define ls (p<<1)
//#define rs (p<<1|1)
#define over(i,s,t) for(register int i = s;i <= t;++i)
#define lver(i,t,s) for(register int i = t;i >= s;--i)
//#define int __int128
//#define lowbit(p) p&(-p)
using namespace std;typedef long long ll;
typedef pair<int,int> PII;
const ll INF = 1e18;
const int N = 5e3+7;
const int M = 5e5+7;
int maxflow,s,t,k;
int n,m,ans,e;
int head[N],ver[M],nex[M],edge[M],cost[M],tot;
bool vis[N];
int dis[N],incf[N],pre[N];void add(int x,int y,int z,int c){//正边反边ver[++tot] = y;edge[tot] = z;cost[tot] = c;nex[tot] = head[x];head[x] = tot;ver[++tot] = x;edge[tot] = 0;cost[tot] = -c;nex[tot] = head[y];head[y] = tot;
}int num(int i,int j,int k){return (i - 1) * n + j + k * n * n;
}bool spfa(){//spfa求最长路queue<int>q;memset(vis,0,sizeof vis);memset(dis,0xcf,sizeof dis);//-INFq.push(s);dis[s] = 0;vis[s] = 1;incf[s] = 1<<30;//增广路各边的最小剩余容量while(q.size()){int x = q.front();q.pop();vis[x] = 0;//spfa的操作for(int i = head[x];i;i = nex[i]){if(edge[i]){//剩余容量要>0,才在残余网络中int y = ver[i];if(dis[y] < dis[x] + cost[i]){dis[y] = dis[x] + cost[i];incf[y] = min(incf[x],edge[i]);//最小剩余容量pre[y] = i;//记录前驱(前向星编号),方便找到最长路的实际方案if(!vis[y])vis[y] = 1,q.push(y);}}}}if(dis[t] == 0xcfcfcfcf)return false;//汇点不可达,已求出最大流return true;
}//EK的老操作了,更新最长增广路及其反向边的剩余容量
void update(){int x = t;while(x != s){int i = pre[x];edge[i] -= incf[t];edge[i ^ 1] += incf[t];//成对变换,反边加x = ver[i ^ 1];//反边回去的地方就是上一个结点}maxflow += incf[t];//顺便求最大流ans += dis[t] * incf[t];//题目要求
}void EK(){while(spfa())//疯狂找增广路update();
}int main(){cin>>n>>k;s = 1;t = 2 * n * n;tot = 1;over(i,1,n)over(j,1,n){int c;scanf("%d",&c);add(num(i,j,0),num(i,j,1),1,c);//自己(入点0)与自己(出点1)add(num(i,j,0),num(i,j,1),k-1,0);//两条边(取k次嘛,第一次有值,以后就没值了,用作下次选取)if(i < n)add(num(i,j,1),num(i+1,j,0),k,0);//自己(出点1)与下一行(入点0)或者下一列(入点0)if(j < n)add(num(i,j,1),num(i,j+1,0),k,0);}EK();printf("%d\n",ans);return 0;
}

【网络流】解题报告: luogu P2045 方格取数加强版(k取方格数)(最大费用最大流)相关推荐

  1. dfs记忆化搜索(带限制的选择问题) 讲解:LeetCode打家劫舍||| / 蓝桥 地宫取宝/蓝桥 k进制数//剪格子//方格分割

    记忆化递归的必要性: 普通的递归可能会重复求解某一值,类似斐波那契数列.同样的子问题可能会被求解多次,这样就会很慢很慢很慢 解决方法:我们把历史求解(子问题)记录下来,如果下次需要求解子问题,那么直接 ...

  2. 解题报告 (十) 单调栈

    文章目录 单调栈 解题报告 PKU 2082 Terrible Sets HDU 2430 Beans HDU 4252 A Famous City PKU 2796 Feel Good HDU 34 ...

  3. 【HDU - 6118】度度熊的交易计划(最小费用可行流,网络流费用流变形 )

    题干: 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片区能够花费a[i]元生产1个 ...

  4. 洛谷 P2053 [SCOI2007]修车 网络流 最小费用最大流 Dinic+Spfa

    题目链接: https://www.luogu.com.cn/problem/P2053 思路参考博客: https://www.luogu.com.cn/blog/a23333/solution-p ...

  5. 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

    «问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...

  6. 【网络流】解题报告:luogu P3376 【模板】网络最大流

    题目链接: P3376 [模板]网络最大流 Dinic Dinic算法是网络流最大流的优化算法之一,每一步对原图进行分层,然后用DFS求增广路.时间复杂度是O(n^2*m),Dinic算法最多被分为n ...

  7. 解题报告:线性规划与网络流24题

    目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...

  8. 网络流20+4题解题报告(已更前20题)

    链接:网络流20+4题解题报告 代码预览:Github 转载于:https://www.cnblogs.com/water-mi/p/10538858.html

  9. 【网络流24题】解题报告:E 、圆桌问题(最大流求二分图多重匹配)

    E .圆桌问题(最大流求二分图多重匹配)[省选/NOI- ] 可以直观的想到,二分图的左边是单位,右边是桌子 由于题目的限制 每个单位只能在一个桌子坐一个人 所以我们就把每个单位向各个桌子连一道流量为 ...

最新文章

  1. OC学习篇之---代理模式
  2. JAVA shell grep
  3. 世界农业巨头嘉吉-国际农民丰收节贸易会:解读与经验借鉴
  4. mysql事务实战_MySQL - 实战 (2) - 事务隔离
  5. IdentityServer4(7)- 使用客户端认证控制API访问(客户端授权模式)
  6. SAP两款CRM产品各方面比较:SAP CRM vs SAP Cloud for Customer
  7. windows系统停止8080端口
  8. PKM(个人知识管理)类软件收集(偶尔更新列表)
  9. 创业失败三年后,这个曾经的富二代变得一无所有
  10. 谈谈我们如何发现 VMware vCenter 的越权 RCE
  11. JS和AIR(FLEX)的互相调用详解
  12. 得到MP3中隐藏的信息
  13. matlab所有画图函数,matlab所有画图函数
  14. 19.丑数(UVa136)
  15. 查找算法:二分法,插值法的公式详解——菜鸟进阶的必经之路!!!
  16. 毕业几年LINUX 驱动研发工作心得分享
  17. “超人”为什么最后1秒拯救地球?
  18. python的冒泡排序
  19. 扬州大学计算机软件工程博士,0836 软件工程博士点
  20. 销售管理之调拨销售管理

热门文章

  1. 深度学习模型压缩与加速综述
  2. 墙裂建议收藏,100道Python练手题目
  3. Myeclipse优化配置
  4. centos开机启动zookeeper
  5. 项目CPU异常高分析
  6. 电子邮件的故事:令人吃惊的预测
  7. Ubuntu Mysql 数据库和表的操作   [2P]
  8. 巧用宏定义进行调试 (转)
  9. # cat /proc/umap/vi
  10. java数据类型_java 数据类型