[Wf2017]Mission Improbable

Time Limit: 1 Sec  Memory Limit: 1024 MB
Submit: 105  Solved: 49
[Submit][Status][Discuss]

Description

那是春日里一个天气晴朗的好日子,你准备去见见你的老朋友Patrick,也是你之前的犯罪同伙。Patrick在编程竞赛
上豪赌输掉了一大笔钱,所以他需要再干一票。为此他需要你的帮助,虽然你已经金盆洗手了。你刚开始很不情愿,
因为你一点也不想再回到那条老路上了,但是你觉得听一下他的计划也无伤大雅。在附近的一个仓库里有一批货物,
包含一些贵重的消费性部件,Patrick企图从中尽可能多地偷些东西出来。这意味着要找一条进去的路,弄晕安保人
员,穿过各种各样的激光射线,你懂的,都是常见的抢劫技术。然而,仓库的核心装备了一套Patrick搞不定的安保系
统。这也是他需要你帮助他的地方。这批货物被放置在一些巨大的立方体箱里,每个箱子的尺寸都是相同的。这些
箱子堆放成许多整齐的堆,每个箱子可以表示成一个三维的网格。安保系统每个小时会用三台相机对这堆货物进行
一次拍照,相机分别为:前置相机(front camera),侧置相机(side camera)和顶置相机(top camera)。前置相机的照
片显示了每一行最高的那堆箱子的高度,侧置相机显示了每一列最高的那堆箱子的高度,顶置相机显示了每个位置是
否存在一堆箱子。如果安保系统发现任何一张照片出现了变化,它会立即拉响警报。一旦 Patrick 进去了,他会确
定每堆箱子的高度并且发给你。图1显示了一种网格可能的放置,以及每台相机会得到的视图。
图 1. 网格的高度值与对应的相机视图。
图 2. 洗劫后网格可能的高度值。
Patrick想尽可能多偷走一些箱子。由于他不能弄坏安保系统,他准备重新安排剩余每堆箱子的放置,使得下一次相
机取像时会得到相同的照片,从而骗过安保系统。在上面的例子中,他可以偷走九个箱子。图2显示了一种可能的剩
余箱子的安置方案能使得安保系统认为与原安置情况相同。Patrick想请你帮他确定在保证能骗过安保系统的情况
下他最多能偷走多少个箱子。你会帮他干完这最后一票么?

Input

第一行包含两个整数r(1≤r≤100)和c(1≤n≤100),分别表示网格的行数与列数。
接下来r行,每行包含c个整数,表示对应行上每堆立方体箱的高度(箱子的数量)。
所有的高度在0到10^9之间 (含边界) 。

Output

输出在不被发现的情况下最多能偷走多少箱子。

Sample Input

样例1
5 5
1 4 0 5 2
2 1 2 0 1
0 2 3 4 4
0 3 0 3 1
1 2 2 1 1
样例2
2 3
50 20 3
20 10 3

Sample Output

样例1
9
样例2
30
题解:
这道题应该如何去想,侧面的,前面的相机,就是行和列的最大值,而上面的相机,只会是判断该点有无,
行的最大值有可能是列的最大值,那么就可以偷更多的箱子,所以如果该点是行列的最大值,就连一条边,
然后就ok了。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define MAXN 100000+10
 7 using namespace std;
 8 typedef long long LL;
 9 struct ed{LL v,next;}edge[MAXN];
10 LL match[220],head[220],vis[220],n,m;
11 LL map[220][220],sum=0,mh[220],ml[220];
12 void add(LL u,LL v){
13     static LL tot=0;
14     edge[++tot].v=v;
15     edge[tot].next=head[u];
16     head[u]=tot;
17 }
18 bool dfs(LL u){
19     for(LL i=head[u];i;i=edge[i].next){
20         LL v=edge[i].v;
21         if(vis[v])continue;
22         vis[v]=1;
23         if(!match[v]||dfs(match[v])){
24             match[v]=u;
25             return true;
26         }
27     }
28     return false;
29 }
30 int main(){
31     scanf("%lld%lld",&n,&m);
32     for(LL i=1;i<=n;i++)
33         for(LL j=1;j<=m;j++){
34             scanf("%lld",&map[i][j]);
35             mh[i]=max(mh[i],map[i][j]);
36             ml[j]=max(ml[j],map[i][j]);
37             if(map[i][j])sum+=map[i][j]-1;
38         }
39     for(LL i=1;i<=n;i++)
40         for(LL j=1;j<=m;j++)
41             if(mh[i]&&map[i][j]&&mh[i]==ml[j])add(i,n+j);
42     for(LL i=1;i<=n;i++)if(mh[i])sum-=mh[i]-1;
43     for(LL i=1;i<=m;i++)if(ml[i])sum-=ml[i]-1;
44     for(LL i=1;i<=n;i++){
45         memset(vis,0,sizeof(vis));
46         if(mh[i]&&dfs(i))sum+=mh[i]-1;
47     }
48     printf("%lld",sum);
49     return 0;
50 }

转载于:https://www.cnblogs.com/fengzhiyuan/p/7717503.html

bzoj4950(二分图最大匹配)相关推荐

  1. 【网络流24题】解题报告:A、飞行员配对方案问题(最大流求二分图最大匹配)

    A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] 题目链接 [问题分析] 二分图最大匹配问题. [建模方法] 在二分图的基础上增加源S和汇T. 1.S向X集合中每个顶点连一条容 ...

  2. 【模板】匈牙利算法 二分图最大匹配题模板

    [任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y ...

  3. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题

    题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...

  4. 2021牛客多校3 - Minimum grid(二分图最大匹配-最大流)

    题目链接:点击查看 题目大意:给出一个 n∗nn*nn∗n 的棋盘,其中有 mmm 个位置是需要填数字的位置,每个位置需要填 [0,k][0,k][0,k] 的数字中的其中一个,可以重复,现在给出每一 ...

  5. HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...

  6. HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)

    题目链接:点击查看 题目大意:给出n个人和m个雨伞,t分钟后就要下雨了,现在给出每个人的坐标和速度,以及雨伞所在的坐标,每个雨伞只能容纳一个人,题目问最多有多少个人能不被淋到 题目分析:二分图最大匹配 ...

  7. POJ - 2226 Muddy Fields(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,地图中'*'代表泥地,'.'代表空地,现在我们有两种木板,一种可以覆盖一行中的任意长度,我们成为行木板,另一种可以覆盖一列中的任意长度,我们成为列木 ...

  8. HDU - 1528 Card Game Cheater(二分图最大匹配)

    题目链接:点击查看 题目大意:题意有点像求田忌赛马的最优解,大概意思就是现在有两个人,每个人都有n张不同的扑克牌,扑克牌的大小首先以点数来确定,点数相同的情况下以花色来决定,红桃(Heart)> ...

  9. HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:现在有一个机器A和一个机器B,A机器有n种模式,B机器有m种模式,现在有k次工作需要完成,每次工作的信息为: id x y:编号为id,在A机器要用x模式完成,在B机器要 ...

最新文章

  1. 软件评测-信息安全-应用安全-资源控制-用户登录限制(中)
  2. ASP.NET Core -中间件(Middleware)使用
  3. 4.mysql数据库创建,表创建模等模板脚本,mysql_SQL99标准的连接查询(内连接,外连接,满外连接,交叉连接)
  4. php serialize mysql_php 序列化(serialize)格式详解
  5. 神经网络模型遇到瓶颈?这些Tricks让你相见恨晚!
  6. Android应用程序消息处理机制
  7. 入门机器学习(八)--神经网络参数的反向传播算法
  8. 202.linux系统相关函数
  9. Qt实现Linux下模拟点击界面,如何利用QT实现模拟鼠标点击?
  10. mfc gridctrl 设置某列自动伸长_三明桥梁智能张拉设备数控智能张拉系统全自动智能张拉系统...
  11. 自动检测技术学习心得体会_公司参加中机建设首届BIM技术应用培训班人员顺利结业...
  12. 缓存-问题:缓存穿透 缓存雪崩 缓存击穿
  13. HTML+JS实现可编辑表格
  14. rbf神经网络python预测代码_RBF神经网络预测
  15. 2D纸娃娃系统的web演示
  16. Tableau官方文档翻译(一):Measures和Dimensions的区别
  17. pyqtgraph的plotItem的轴刻度设置/轴刻度值风格设置
  18. Android的屏幕适配
  19. java根据url获取pdf流_从URL获取动态创建的PDF
  20. 条码固定资产管理PDA应用

热门文章

  1. 【51Nod - 1270】数组的最大代价(dp,思维)
  2. html写原生曲线图,HTML5 平滑的正弦波曲线图
  3. cass生成曲线要素文件_几种常见的CASS字体异常问题,教你如何解决
  4. java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener
  5. 怎样提高WebService性能大数据量网络传输处理(转)
  6. leetcode283. 移动零 比官方更好的解法。
  7. 数据结构课上笔记13
  8. 对于linux socket与epoll配合相关的一些心得记录
  9. C++ 使用move来删除用户指定的文件
  10. Java JUC工具类--Exchanger