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());
}
}

2016级算法期末模拟练习赛-E.AlvinZH的青春记忆III的更多相关文章

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

    1086 AlvinZH的青春记忆IV 思路 难题,动态规划. 这是一道很有意思的题,因为它不仅卡了时间,也卡了空间,而且卡的很妙很迷. 光是理解题意已经有点难度,简化题意:两串数字序列,相等的数字定 ...

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

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

  3. 2016级算法期末模拟练习赛-C.AlvinZH的青春记忆II

    1084 AlvinZH的青春记忆II 思路 中等题,二分. 简化题意,一列数字,每秒会自动-1,特殊操作可以使一个数在1s内-k,问这些数都减至0需要多久. 答案肯定在[1,xMax]之间,采用二分 ...

  4. 2016级算法期末模拟练习赛-D.AlvinZH的序列问题

    1111 AlvinZH的序列问题 思路 中等题,动态规划. 简化题意,. 坑点一:二维int数组MLE,明显会超过内存限制,由于\(n\)最大为1e4,那么我们的dp数组最大也是1e4,考虑使用sh ...

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

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

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

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

  7. 2016级算法期末上机-D.简单·AlvinZH's Fight with DDLs I

    1117 AlvinZH's Fight with DDLs I 思路 简单题,动态规划. 本题与期末练习赛B题很相似,而且更为简单些.简化问题:在数字序列上取数,不能取相邻的数. DP数组定义,dp ...

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

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

  9. 2016级算法第二次上机-E.AlvinZH的儿时梦想——运动员篇

    862-AlvinZH的儿时梦想--运动员篇 思路 难题. 应该想到,不管给出的数据如何,每一个淘汰的人不会对最终答案产生任何影响,所以每次淘汰就把人除掉就可以了,最后剩下的两个人计算它们从开始到相遇 ...

随机推荐

  1. cmake 强制链接静态库

    add_executable(main main.cpp) target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a) 静态库和动态库共 ...

  2. 第十届国际用户体验创新大赛携Mockplus走进校园

    今日立夏,万木并秀,生生不息,第十届国际用户体验创新大赛即将拉开序幕.5月5日下午,一场用户体验设计经验分享活动携带众多嘉宾降临成都理工大学,为西南赛区首站赛事宣讲. 本次宣讲活动邀请了华为技术有限公 ...

  3. TOGAF架构培训材料学习总结

        作于一个架构师尤其是企业架构师来说,丰富的理论知识可以帮助他在架构规划及管理过程中站在更高的角度去看待问题,历史发展原因有很多已成体系的架构理论,TOGAF是近年来比较接地气的,受到了政府和银 ...

  4. 电商商品规则属性sku 工具类

    /** * 商品模块: * 使用:var SKU = sku.init({ id:'sku', item: item, data:data }); * @config item = [{"i ...

  5. (深搜)Oil Deposits -- hdu -- 1241

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1241 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  6. Web Service Error wsse:InvalidSecurity Policy Requires Integrity (Doc ID 1370736.1)

        Web Service Error wsse:InvalidSecurity Policy Requires Integrity (Doc ID 1370736.1) Modified: 13 ...

  7. Android-自定义控件之绘图基础

    画圆形,效果图: 布局中去指定自定义View: <view.custom.androidcustomviewbook.a_draw_base.BaseView android:layout_wi ...

  8. CentOS6.3安装MySQL5.5

    1.查看系统是否安装了MySQL 使用命令: #rpm -qa | grep mysql 2.卸载已安装的MySQL 卸载mysql命令如下: #rpm -e --nodeps  mysql-libs ...

  9. svn: Can't convert string from 'UTF-8' to native encoding: 解决办法

    在linux中,svn co 或 svn up 时有中文文件名的文件的话,可能会报下面的错: [root@linkea-dev-srv1 ~]# svn upsvn: Can't convert st ...

  10. TSQL--NULL值和三值逻辑

    在SQL SERVER 中逻辑表达式存在三种值:TRUE+FALSE+UNKNOWN.UNKNOW可以理解为不确定,既不是TRUE又不是FALSE的表达式,主要由与NULL相关的逻辑判断引起,值为NU ...