正题

jozj 3447


题目大意

给你一个n*m的矩阵,每个位置有一个数,每一行每一列都只能选两个数,问你所选数字之和最大是多少


解题思路

对于该矩阵,我们可以建立一个网络图(如下图)

对于每一行建立建立一个点(下图第一列),连向S,费用为0,流量为2
对于每一列建立一个点(下图第二列),连向T,费用为0,流量为2
对于每个点连接相应的行和列,费用为该点的数字大小,流量为1

建好网络图后,跑最大费用即可(注意这里不能直接跑费用流,流量不一定最大)

该题求最大费用,如果跑反边,那么反边的边权绝对值会比上一条边大,因为会先跑费用大的,所以不存在负权回路,可以用SPFA


代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 10000
using namespace std;
const int inf = 1000000000;
int n, m, x, w, s, t, tot, ans, v[N], vv[N], p[N], b[N], ls[N], nx[N], head[N];
queue<int>d;
struct rec
{int to, next, lst, val;
}a[N];
void add(int x, int y, int z, int v)
{a[++tot].to = y;a[tot].lst = z;a[tot].val = -v;a[tot].next = head[x];head[x] = tot;a[++tot].to = x;a[tot].lst = 0;a[tot].val = v;a[tot].next = head[y];head[y] = tot;return;
}
bool spfa()
{memset(b, 127 / 3, sizeof(b));memset(p, 0, sizeof(p));memset(ls, 0, sizeof(ls));memset(nx, 0, sizeof(nx));while(!d.empty()) d.pop();p[s] = 1;b[s] = 0;ls[s] = inf;d.push(s);while(!d.empty()){int h = d.front();d.pop();for (int i = head[h]; i; i = a[i].next)if (b[h] + a[i].val < b[a[i].to] && a[i].lst){b[a[i].to] = b[h] + a[i].val;ls[a[i].to] = min(ls[h], a[i].lst);nx[a[i].to] = i;if (!p[a[i].to]){p[a[i].to] = 1;d.push(a[i].to);}}p[h] = 0;}return ls[t] > 0 && b[t] < 0;//保证费用大于0(这里建立负边跑最短路)
}
void dfs()
{int now = t;while(nx[now]){a[nx[now]].lst -= ls[t];a[nx[now]^1].lst += ls[t];now = a[nx[now]^1].to;}ans += b[t] * ls[t];return;
}
int main()
{scanf("%d%d", &n, &m);tot = 1;s = ++w;t = ++w;for (int i = 1; i <= n; ++i)//建图{v[i] = ++w;add(s, v[i], 2, 0);}for (int i = 1; i <= m; ++i){vv[i] = ++w;add(vv[i], t, 2, 0);}for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j){scanf("%d", &x);if (!x) continue;add(v[i], vv[j], 1, x);}while(spfa())dfs();printf("%d", -ans);return 0;
}

【费用流】摘取作物(jozj 3447)相关推荐

  1. 网络流 最大流 最小割 费用流

    [腾讯文档]网络流初步 网络流初步 文章目录 网络流初步 一.网络流简介 1. 网络 2. 流 3. 再次理解网络流 二.常见题型(三种) 三.相关问题对应算法介绍 1.最大流 (1) FF算法 - ...

  2. [BZOJ 1221][HNOI2001]软件开发(费用流)

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

  3. 费用流 -- 四川省赛F-Direction Setting [拆边成点+费用流]

    题目链接 题目大意: 就是给你一个nnn个点mmm条边的无向图,每个点有个值是aia_iai​现在你把每条边都赋予一个方向之后这个图就是有向图了,那么设第iii个点的入度是did_idi​,现在设 D ...

  4. UVA1411 Ants(带权二分图的最大完美匹配、zkw费用流)

    题解 给定一些黑点白点,要求一个黑点链接一个白点并且线段不相交(转成二分图最大权匹配使用费用流解决)<训练指南>P351 输出方案:满流即为答案(满流是指这条路的流量跑满了,也就是说edg ...

  5. 餐巾计划问题 线性规划与网络流24题之10 费用流

    相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...

  6. BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...

  7. bzoj3171: [Tjoi2013]循环格(费用流)

    传送门 其实这题的建图并不难(虽然我并没有想出来) 首先,每一个点的入度和出度必须为$1$ 那么我们考虑拆点 每个点的出度点向它能到达的点的入度点连边,容量$1$,如果方向为原来的方向则费用$0$否则 ...

  8. 洛谷 - P2045 - 方格取数加强版 - 费用流

    原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...

  9. 【BZOJ2245】[SDOI2011]工作安排 拆边费用流

    [BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被 ...

最新文章

  1. axi dma 寄存器配置_FPGA Xilinx Zynq 系列(三十二)AXI 接口
  2. 安装python3.6.1_CentOS 7 安装Python3.6.1 多版本共存
  3. 我如何一分钱没花学完AI课程,入职新浪算法工程师
  4. 内蒙古计算机专修学院单招,内蒙古电子信息职业技术学院单招多少分能上?
  5. linux卸载git,并且安装新版本git
  6. jzoj4485-[GDOI 2016 Day1]第一题 中学生数学题【数学】
  7. php include 和require的区别与转码
  8. Windows的拖放操作使用方法
  9. cookie 设置有效期 检测cookie
  10. 用C#创建Windows服务(Windows Services)并打包!
  11. html图片上传框架,HTML+JS图片上传源码
  12. 计算机硬件或网络连接失败,Win10系统出现45错误代码:硬件设备未连接到计算机...
  13. mac os 虚拟机parallels desktop 安装 win10 和 激活
  14. 速读水浒!108将的简介与结局
  15. tar --exclude用法
  16. webpack学习之路------配置多个 HTML 文件
  17. 哪款蓝牙耳机游戏体验感好?适合打游戏的蓝牙耳机推荐
  18. 数据链路层学习之LLDP
  19. #Python小技巧#教你用Python在Excel里画画
  20. w ndows11如何设置电源选项,2018年度巨献(4):11款650W全模组80Plus金牌+电源横评

热门文章

  1. 最近公共祖先_[LeetCode] 236. 二叉树的最近公共祖先
  2. case when影响性能吗_字段为NULL会影响查询性能吗?
  3. mysql 表与表之间的条件比对_值得收藏 | 一份最完整的MySQL规范
  4. python网页动图_python,tensorflow线性回归Django网页显示Gif动态图
  5. 三相全桥整流电路_三相桥式全控整流电路
  6. bcm943602cs蓝牙用不了_原来手机的蓝牙功能这么强大!除了连接耳机,还有这六大实用功能...
  7. 题目 1885: [蓝桥杯][2017年第八届真题]分巧克力+二分
  8. Rx2.0后台开发分享
  9. java 计算i 出现的次数_JAVA算法:按照给定的段落统计单词出现次数(JAVA代码)...
  10. 华为笔记本软件商店_华为应用市场 PC 端体验:干净好用 - 华为