1083 AlvinZH的青春记忆III

思路

难题,二分图。

说这是一个考察二分图的题目,你可以会说“不可能”,这哪里像一个二分图了!这真的是一个二分图,考察的是最小顶点覆盖。

你不知道最小顶点覆盖没有关系,别百度,先慢慢分析,别先入为主。

简化题意。A、B两列数字,若B[i]%A[j]==0,则二者需要去掉一个。问一共最少需要去掉多少人!

错误方法:二重循环记录可以整除的双方编号B[i]和A[j],记M1[A[j]]=M2[B[i]]=true,之后求M1、M2中为true的数量,取较小值输出。

为什么这是错的?我反手给出一个反例:2,4,6与2,10,12,计算出M1、M2中为true的数量都是3,但是答案却为2,因为只要去掉A中的2和B中的12即可。

错误的原因在于没有考虑可以两个数组中同时删去一些数据。那么对于两边都有可能删除数据的情况,该怎么处理呢?答案是不考虑。当然,我指的不是不考虑这种情况,而是不考虑点,转而考虑边,如果有B[i]%A[j]==0,则将来两个数之间连上一条边,表示需要删掉其中之一,我们的目标是删去其中一些点,使得两边不存在连线。

不存在连线是什么意思?没错,就是不存在增广路径!

增广路径的定义如下:若P是图G中一条联通两个未匹配顶点的路径,且属于M的边和不属于M的边在P上交替出现,则称P为相对于M的一条增广路径。

那么又如何处理删去点呢?总不能尝试删去一个点,DFS删点过程中再DFS找增广路径吧,想想都可怕。这里借用二分图匹配来完成模拟删点。先来个定义转化,二分图的一个匹配(包含若干条边的集合,且其中任意两条边没有公共端点):只要删掉这个匹配中每条边的其中一个点,就可以把这些边抹去。如果还有剩下的边,那么代表原图一定存在增广路径,如果求得了二分图最大匹配,代表不存在增广路径,假设最大匹配数为x,那么一定存在一种方法,删去最大匹配中的x个点,使二分图的这个最大匹配完全“崩溃”,即匹配边都不存在了。注意,删点的方法肯定不能任意地选匹配边两点中的一点,由于刚刚已经不存在增广路径,也就是说未匹配边中的点肯定有一个最大匹配顶点,删点的过程中不仅可以删去匹配边,也可以保证把未匹配边一同删去。

不知道你听明白了没有?说到底,这是一个二分图匹配的最小顶点覆盖。我竟然从实际的角度说明最小顶点覆盖=二分图最大匹配数,需要说明:理论上也已经证明。

最小顶点覆盖:最少的顶点数使得二分图G中的每条边都至少与其中一个点相关联。二分图的最小顶点覆盖数=二分图的最大匹配数。

很明显,我们找的就是这个最小顶点数,由于每条边都与其中一个点关联,如果把这个最小顶点数所对应顶点全部删去,那么所有的边也没了。

接下来就是求二分图最大匹配了,不说了,参考AlvinZH的学霸养成记IV。

分析

最小点覆盖练习题

二营长,你他娘的意大利炮呢

关于最小顶点覆盖=二分图的最大匹配参考

二分图详解

参考代码

//
// Created by AlvinZH on 2017/12/5.
// Copyright (c) AlvinZH. All rights reserved.
//#include <cstdio>
#include <cstring>
#include <vector>
#define MaxSize 1005
#define INF 0x3f3f3f3f
using namespace std;int n, m, ans;
vector<int> G[MaxSize];//记录匹配的双方弟子
int match[MaxSize];//记录匹配点
int visit[MaxSize];//记录是否访问int A[MaxSize], B[MaxSize];bool dfs(int x)//寻找增广路径
{for (int i = 0; i < G[x].size(); ++i){int to = G[x][i];if(!visit[to]){visit[to] = 1;if(!match[to] || dfs(match[to])){match[to] = x;return true;}}}return false;
}int MaxMatch()
{ans = 0;memset(match, 0, sizeof(match));for (int i = 1; i <= m; ++i){memset(visit, 0, sizeof(visit));//清空访问if(dfs(i)) ans++;//从节点i尝试扩展}return ans;
}int main()
{while(~scanf("%d %d", &n, &m)){for (int i = 1; i < MaxSize; ++i)G[i].clear();for (int i = 1; i <= n; ++i)scanf("%d", &A[i]);for (int i = 1; i <= m; ++i){scanf("%d", &B[i]);for(int j = 1; j <= n; ++j){if(B[i] % A[j] == 0)G[i].push_back(j);}}printf("%d\n", MaxMatch());}
}

转载于:https://www.cnblogs.com/AlvinZH/p/8137732.html

2016级算法期末模拟练习赛-E.AlvinZH的青春记忆III相关推荐

  1. 2016级算法期末模拟练习赛-B.AlvinZH的青春记忆I

    1083 AlvinZH的青春记忆I 思路 中等题,动态规划. 简化题意,一个环上取数,数不可相邻,取取得数之和最大值. 环不好表示,可以解开变成一列数,那么答案应为下列两种情况较大者. ①:取第一个 ...

  2. 2016级算法期末模拟练习赛-A.wuli51和京导的毕业旅行

    1063 wuli51和京导的毕业旅行 思路 中等题,二分+贪心. 简化题意,将m+1个数字分成n份,ans为这n段中每段数字和的最大值,求ans最小值及其方案. 对于这种求最小的最大值,最常用的方法 ...

  3. 2016级算法期末上机-H.难题·AlvinZH's Fight with DDLs III

    1119 AlvinZH's Fight with DDLs III 思路 难题,最小点覆盖. 分析题意,某一个任务,既可以在笔记本A的 \(a\) 模式下完成,也可以在笔记本B的 \(b\) 模式下 ...

  4. 2016级算法期末上机-F.中等·AlvinZH's Fight with DDLs II

    1118 AlvinZH's Fight with DDLs II 思路 中等题,贪心. 理解题意,每次攻击中,可以使某个敌人生命值-1,自己生命值减去∑存活敌人总攻击力. 贪心思想,血量少攻击高的要 ...

  5. 2016级算法期末上机-I.难题·ModricWang's Fight with DDLs III

    1126 ModricWang's Fight with DDLs III 思路 由于题目中已经说明了时间经过了正无穷,因此初始位置是不重要的,并且每条边.每个点的地位是均等的.因此到达每个点的概率就 ...

  6. 北航2018级算法期末上机部分题解

    北航2018级算法期末第二次上机考试部分题解 C题 三角形 题目描述 数据大小 输入 输出 解题思路 题解代码 D 魔术 题目描述 数据描述 输入 输出 解题思路 题解代码 E 乘法 题目描述 输入 ...

  7. 2016级算法第一次练习赛-E.AlvinZH的儿时回忆——蛙声一片

    864 AlvinZH的儿时回忆----蛙声一片 题目链接:https://buaacoding.cn/problem/865/index 思路 中等题.难点在于理解题意!仔细读题才能弄懂题目规则.整 ...

  8. 2016级算法第五次上机-E.AlvinZH的学霸养成记IV

    1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的 ...

  9. 2016级算法第六次上机-D.AlvinZH的学霸养成记V

    1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × ...

  10. 2016级算法第四次上机-C.AlvinZH的1021实验

    975 AlvinZH的1021实验 思路 贪心,简单题. 题目已经说明有且只有一种方法表示所求数,简单列举几项可以发现只由前i个砝码会可以表示[1,∑Wi]的所有数的.先找到最大需要的砝码Wi,问题 ...

最新文章

  1. Dundas使用手册
  2. 使用GitHub免费搭建属于自己的网站
  3. python基础教程教材-最好的Python入门教材是哪本?
  4. 题目1095:2的幂次方
  5. 如何给a标签绑定ajax事件
  6. 中if判断中文_当Excel表格中的条件判断超过8个,用IF函数不容易实现怎么办?...
  7. EOF是什么?(转)
  8. Leecode 136. 只出现一次的数字
  9. C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)(转载)...
  10. linux命令之route
  11. 什么是PY平台?Python平台用途及安装的详细方法
  12. excel熵值法计算权重_SPSSAU一众新功能上线:高级公式、综合得分一键计算!
  13. 互联网日报 | 前11月全国网购超10万亿元;B站8月月活首次突破2亿;华为Mate40标准版开启预售...
  14. 第一章---近红外光谱分析概述1
  15. day4 vue 学习笔记 组件 生命周期 数据共享 数组常用方法
  16. 试算平衡表示例图_试算平衡表的编制 试算平衡表示例图
  17. 通信感知一体化技术思考
  18. 五、python函数、装饰器、内置函数、json及模块
  19. 冒着开除的风险,让我们解密图书管理之校长看完直夸好IO流下篇
  20. 二叉树输入与存储的问题

热门文章

  1. Lightroom Classic 教程,如何在 Lightroom 中风格化照片?
  2. 在 Mac 上如何使用 iCloud 钥匙串保护信息安全?
  3. Mac翻译软件Mate Translate
  4. SoundSource 5 for Mac(音频控制工具)
  5. 如何在Mac上批量转换和调整图像大小
  6. 如何用4K YouTube转换视频为MP3,同时设置成MP3桌面播放器?
  7. Fantastical 2如何编辑事件?
  8. flume学习(七):如何使用event header中的key值
  9. Java SE作业:判断一个字符串是否是视频文件
  10. Android开发——通过扫描二维码,打开或者下载Android应用