BZOJ 4950 [Wf 2017] 二分图最大匹配 解题报告
来源:互联网 发布:医学论文数据库 编辑:程序博客网 时间:2024/04/27 05:13
Description
那是春日里一个天气晴朗的好日子,你准备去见见你的老朋友Patrick,也是你之前的犯罪同伙。Patrick在编程竞赛上豪赌输掉了一大笔钱,所以他需要再干一票。为此他需要你的帮助,虽然你已经金盆洗手了。你刚开始很不情愿,因为你一点也不想再回到那条老路上了,但是你觉得听一下他的计划也无伤大雅。在附近的一个仓库里有一批货物,包含一些贵重的消费性部件,Patrick企图从中尽可能多地偷些东西出来。这意味着要找一条进去的路,弄晕安保人员,穿过各种各样的激光射线,你懂的,都是常见的抢劫技术。然而,仓库的核心装备了一套Patrick搞不定的安保系统。这也是他需要你帮助他的地方。这批货物被放置在一些巨大的立方体箱里,每个箱子的尺寸都是相同的。这些箱子堆放成许多整齐的堆,每个箱子可以表示成一个三维的网格。安保系统每个小时会用三台相机对这堆货物进行一次拍照,相机分别为:前置相机(front camera),侧置相机(side camera)和顶置相机(top camera)。前置相机的照片显示了每一行最高的那堆箱子的高度,侧置相机显示了每一列最高的那堆箱子的高度,顶置相机显示了每个位置是否存在一堆箱子。如果安保系统发现任何一张照片出现了变化,它会立即拉响警报。一旦 Patrick 进去了,他会确定每堆箱子的高度并且发给你。
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
【解题报告】
代码如下:
/************************************************************** Problem: 4950 User: onepointo Language: C++ Result: Accepted Time:48 ms Memory:1780 kb****************************************************************/#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 210#define M 100010#define LL long longint n,m,cnt=-1,head[N];struct Edge{int to,nxt;}e[M];int vis[N],match[N];int mp[N][N],ml[N],mh[N];LL sum=0;void adde(int u,int v){ e[++cnt].to=v; e[cnt].nxt=head[u]; head[u]=cnt;}bool dfs(int u,int flag){ for(int i=head[u];~i;i=e[i].nxt) { int v=e[i].to; if(vis[v]==flag) continue; vis[v]=flag; if(!match[v]||dfs(match[v],flag)) { match[v]=u; return 1; } } return 0;}int main(){ memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) { scanf("%d",&mp[i][j]); mh[i]=max(mh[i],mp[i][j]); ml[j]=max(ml[j],mp[i][j]); if(mp[i][j]) sum+=mp[i][j]-1; } for(int i=1;i<=n;++i) if(mh[i]) sum-=mh[i]-1; for(int i=1;i<=m;++i) if(ml[i]) sum-=ml[i]-1; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) { if(mh[i]==ml[j]&&mp[i][j]) adde(i,j+n); } for(int i=1;i<=n;++i) { if(dfs(i,i)) sum+=mh[i]-1; } printf("%lld\n",sum); return 0;}
- BZOJ 4950 [Wf 2017] 二分图最大匹配 解题报告
- BZOJ4952 [Wf 2017] 二分答案 解题报告
- HDU 2063 二分图最大匹配 解题报告
- [BZOJ]4950 二分图 + 最大匹配
- bzoj 4950(二分图最大匹配)
- 白话二分匹配之最大匹配+附上hdu2063解题报告
- 解题报告-HDOJ-2063(最大二分匹配-匈牙利算法)
- BZOJ 2744 [HEOI 2012] 二分图最大独立集 解题报告
- BZOJ 4950 Mission Improbable (二分图最大匹配)
- [BZOJ]3140 二分图最大匹配
- BZOJ 1191(二分图最大匹配)
- BZOJ4951 [Wf 2017] 分治 解题报告
- bzoj 4443(二分+二分图最大匹配)
- Pku acm 1469 COURSES 数据结构题目解题报告(十一)---- 匈牙利算法求二分图的最大匹配
- Pku acm 2239 Selecting Courses 数据结构题目解题报告(十二)---- 匈牙利算法求二分图的最大匹配
- Pku acm 1274 The Perfect Stall 数据结构题目解题报告(十三)---- 匈牙利算法求二分图的最大匹配
- Pku acm 2536 Gopher II 数据结构题目解题报告(十四)---- 匈牙利算法求二分图的最大匹配
- Pku acm 2771 Guardian of Decency 数据结构题目解题报告(十五)---- 匈牙利算法求二分图的最大匹配
- 漂亮的登录界面
- k-Nearest Neighbors(k近邻)
- 使用cifar100,转化lmdb及制作均值文件
- PS第一课,认识Photoshop
- 设计模式之单例模式
- BZOJ 4950 [Wf 2017] 二分图最大匹配 解题报告
- pg归档日志的开启与关闭
- Java 数字中使用下划线
- 顺序查找和二分查找
- 51nod 1584 加权约数和
- [leetcode] 第五周作业
- MongoDB用户管理
- jsp常见的指令总结
- CSS_1_2017_10_9