今天是开通博客的第一天 ,现在参加牛客暑假多校训练赛, 恰好在补网络流二分图的题,就顺便把比赛这道题搬出来了
提示(本题需要的前序知识 ,网络流算法 ,二分图匹配,最大匹配 ,最小边覆盖,最大独立集 ,最小点覆盖)
题意翻译过来是这样
给你一个集合 { a1,a2,a3……an}
给你一个n 代表集合的内元素的数量
将每个元素转化为二进制表示,问有多少个元素至少有两个二进制位是不同的 (求出这些元素组成的最大集合) (集合内两两元素都满足这个条件)
首先 {至少有两个二进制位不同}的反命题为 {只有一个二进制位相同}
所以我们建立一个图
点:{a1,a2, ……an}
边: 若点a与点b只有一个二进制不同,则连边。
接下来证明连出来的图是一个二分图
首先 有一条路径 从a指向b 中间经过多个点
a->x1->x2->-x3->……->xn->b;
a与x1有一位不同 x1与x2有一位不同
(因为所有的值 都是 distinct) 所以 a与x2有两位不同
所以 a与xn有n位不同
所以 在一条路径中 第t和t+2个点 一定没有连边 证毕
经过上述思考 我们建图 答案为这个图的最大独立集
并且跑一遍二分图算法求出最大匹配
|最大独立集|=总点数-|最大匹配| (因为在二分图中,|最大匹配|=|最小点覆盖|)
我的QQ 642325110 有指正的地方可以告诉我
至于这些前序知识 大家可以查阅资料 或者我有空会补上这些知识的介绍