\(\text{Problem}\)

在一个矩阵里选数,每行最多选两个,每列最多选两个,最大会价值

\(n,m \le 30\)

\(\text{Analysis}\)

对个这个限制如何实现?

跑费用流

把行看做点,列看做点

点对 \((i,j)\) 就用 \(i\) 行点连向 \(j\) 列点,流量为 \(1\),费用为 \(-v[i][j]\)

原点向行点连一条流量为 \(2\),费用为 \(0\) 的边,列点向汇点连一条流量为 \(2\),费用为 \(0\) 的边

这样就可以保证限制了

因为跑 \(spfa\) 得到最小费用,但要注意不一定要最大流,可行流即可

所以 \(spfa\) 后判断 \(dis[T]\) 的正负情况,决定是否继续

\(\text{Code}\)

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std; const int N = 905;
int n , m , S = 0 , T, Maxflow , Mincost;
int dis[N] , h[N] , vis[N] , pre[N] , edge[N] , flow[N] , tot = 1; queue<int> d;
struct node{
int to , nxt , w , f;
}e[N << 1 + 10]; inline void add(int u , int v , int w , int f){e[++tot] = node{v, h[u], w, f}, h[u] = tot;} int spfa()
{
memset(vis , 0 , sizeof(vis));
memset(dis , 127 , sizeof(dis));
memset(flow , 127 , sizeof(flow));
d.push(S);
vis[S] = 1 , dis[S] = 0 , pre[T] = -1;
while (!d.empty())
{
int now = d.front();
d.pop(), vis[now] = 0;
for(register int i = h[now]; i; i = e[i].nxt)
if (dis[e[i].to] > dis[now] + e[i].f && e[i].w)
{
dis[e[i].to] = dis[now] + e[i].f;
flow[e[i].to] = min(flow[now] , e[i].w);
pre[e[i].to] = now, edge[e[i].to] = i;
if (!vis[e[i].to]) vis[e[i].to] = 1 , d.push(e[i].to);
}
}
return (dis[T] < 0 && pre[T] != -1);
} int MCMF()
{
while (spfa())
{
Maxflow += flow[T], Mincost += dis[T] * flow[T];
int now = T;
while (now != S)
e[edge[now]].w -= flow[T], e[edge[now] ^ 1].w += flow[T], now = pre[now];
}
return Mincost;
} int main()
{
freopen("pick.in", "r", stdin);
freopen("pick.out", "w", stdout);
scanf("%d%d", &n, &m), T = n + m + 1;
for(int i = 1, x; i <= n; i++)
for(int j = 1; j <= m; j++) scanf("%d", &x), add(i, j + n, 1, -x), add(j + n, i, 0, x);
for(int i = 1; i <= n; i++) add(S, i, 2, 0), add(i, S, 0, 0);
for(int j = 1; j <= m; j++) add(j + n, T, 2, 0), add(T, j + n, 0, 0);
printf("%d\n", -MCMF());
}

JZOJ 3447.摘取作物的更多相关文章

  1. BZOJ3438 小M的作物(最小割)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=3438 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为 ...

  2. bzoj 3438: 小M的作物

    Description 背景 小M还是个特么喜欢玩MC的孩纸... 描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一 ...

  3. 【BZOJ-3438】小M的作物 最小割 + 最大权闭合图

    3438: 小M的作物 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 825  Solved: 368[Submit][Status][Discuss ...

  4. BZOJ 3438: 小M的作物( 最小割 )

    orz出题人云神... 放上官方题解... 转成最小割然后建图跑最大流就行了... ---------------------------------------------------------- ...

  5. P1361 小M的作物

    P1361 小M的作物 题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号). 现在,第 ...

  6. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  7. BZOJ_3438_小M的作物_最小割

    BZOJ_3438_小M的作物_最小割 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物) ...

  8. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  9. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  10. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

随机推荐

  1. 关于cannot remove ‘directory': Directory not empty的解决办法

    解决方法 首先你应该使用 rm -rf 目录名 这样确保可以递归删除目录 如果出现 cannot remove 'directory': Directory not empty 报错信息,重启电脑解决 ...

  2. 【Java EE】Day14 Servlet、HTTP、Request

    一.Servlet 二.HTTP 三.Request 四.登录案例

  3. 【大数据面试】【数仓项目】分层:ODS层、DWD层、DWS层、ADS层构成、操作

    一.ODS层 1.保持数据原貌,不做任何修改 2.数据压缩:LZO压缩,减少磁盘空间 3.创建的是分区表:可以防止后续的全表扫描 包括 用户行为:string line dt    ods_start ...

  4. python3中的常见知识点2

    python3中的常见知识点2 列表与栈和队列 map()函数 python列表遍历的4种方式 参考链接 列表栈和队列 1.列表作为栈使用 栈:先进后出,First In Last Out 使用 ap ...

  5. Selenium4+Python3系列(十三) - 与docker中的jenkins持续集成

    前言 文章更新到这一篇时,其实我还是很开心的,因为这也正是这系列教程的最后一篇文章,也算是完成了一个阶段性的小目标,也很感谢那些愿意看我文章与我交流学习的同学,感谢有你们的支持和陪伴. Jenkins ...

  6. 基本能看懂的C编译器,只有365行!

    Fabrice Bellard is a French computer programmer known for writing FFmpeg, QEMU, and the Tiny C Compi ...

  7. [深度学习] Contractive Autoencoder

    ​  转载于DeepLearning: Contractive Autoencoder - dupuleng - 博客园 一.雅克比矩阵 雅克比矩阵是一阶偏导,假设(x1,x2,....,xn)到(y ...

  8. [深度学习] ncnn编译使用

    文章目录 工程 ncnn工程编译使用(cpu) ncnn工程编译使用(vulkan) 参考 工程 ncnn工程编译使用(cpu) 在linux下建立如CMakeLists文件即可编译生成ncnn工程 ...

  9. 又一重要进展发布!OpenMMLab算法仓支持昇腾AI训练加速

    摘要:上海人工智能实验室的浦视开源算法体系(OpenMMLab)团队基于昇腾AI发布了MMDeploy 0.10.0版本,该版本已支持OpenMMLab算法仓库在昇腾异构计算架构CANN上的推理部署. ...

  10. Linux c 检测当前网卡是否已经启动

    思路: 1.socket 建立一个数据报套接字. 2.定义一个struct ifreq ifr 结构体.将网络名称如"eth0" 赋值给ifr结构体的ifr.ifr_name. 3 ...