首页 > 其他分享 >二分图相关

二分图相关

时间:2024-04-05 15:11:06浏览次数:25  
标签:二分 DAG 匹配 覆盖 路径 最小 相关 反链

基础

最小点覆盖 = 最大匹配

我们假设最小点覆盖的集合为 \(V\),最大匹配的集合为 \(E\),因为最大匹配中的边都互相不交,
所以我们可以让最大匹配中的边的端点任意选择一个点,就有:

\[|V|\ge |E| \]

于是另一边不太好证明,我们就记住这一边的证明,感性理解~

最大独立集 = 总点数 - 最小点覆盖

假设最小点覆盖为 \(V_1\),最大独立集为 \(V_2\),我们考虑最小点覆盖的补集,如果补集中的任意两点之间有边,那么对应的最小点覆盖这一条边就没有被覆盖,与最小点覆盖冲突了。即最小点覆盖的补集是独立集。所以有:

\[n-|V_1|\le |V_2|\tag 1 \]

同理,最大独立集的补集也一定满足点覆盖,那么就有:

\[n-|V_2|\ge |V1| \]

即:

\[n-|V_1|\ge|V_2|\tag 2 \]

根据 \((1),(2)\) 两式可得:\(n-|V_1|=|V_2|\)。

DAG:

基本定义:

  • 最小路径覆盖:用最少的路径覆盖 DAG 上的所有点,路径之间不能有交。
  • 最小链覆盖:和最小路径覆盖的区别是路径之间可以有交(点),边不可以交。
  • 最长反链:最大的点集,满足两点之间互相不连通。

最小路径覆盖 = 总点数 - 拆点后的最大匹配

对于一张 DAG,我们考虑让入点和出点做二分图匹配,考虑匹配的意义:
最开始所有的点属于自己的路径,当一个入点匹配出点的时候,表示两个点合并到同一条路径上了。那么式子就非常显而易见了。

最长反链 = 最小链覆盖

对于反链中的点两两不连通,那么覆盖每一个点都至少需要这么多的路径,于是:

\[最长反链 \le 最小链覆盖 \]

同样的另一边不太好证明,我们感性理解即可。

导弹拦截问题

原问题就是求一个序列最少由多少个非递增序列构成,我们考虑建出一张 DAG,对于
\(i<j,a_i\ge a_j\),连边: \(i\longrightarrow j\),那么就会形成一张 DAG。
那么原题就相当于求这一张 DAG 的最小路径覆盖(因为路径不能有交)。
但是仔细考虑,发现对于这样的建图,如果 \(i\to j,j\to k\),那么就一定有一条边 \(i\to k\),
那么就会发现对于任意有交的情况,一定可以转为无交的情况。
也就是对于这张特殊的 DAG,有最小路径覆盖 = 最小链覆盖,所以原问题就转变为求最长反链,
那么最长反链就相当于原序列中的最长上升子序列。。

标签:二分,DAG,匹配,覆盖,路径,最小,相关,反链
From: https://www.cnblogs.com/weirdoX/p/18115773

相关文章

  • [蓝桥杯 2022 国 A] 环境治理(二分 + 弗洛伊德)
        通过题目描述,我们得知如果枚举所有的天数,就不会通过所有的样例,因此我们可以通过二分来列举符合要求的天数,并且我们知道两个城市之间衡量的灰尘度标准就是灰尘度总和最小的那一段路径,也就是说我们需要寻找到权值和最低的那条路径,而我们知道每两个点之间都有路径......
  • 【Qt】系统相关(事件)
    目录一、概念二、事件处理三、鼠标事件1.鼠标点击事件2.鼠标释放事件3.鼠标移动事件四、按键事件一、概念事件是应用程序内部或者外部产生的事情或者动作的统称。在Qt中使用一个对象来表示一个事件。所有的Qt事件均继承于抽象类QEvent。事件是由系统或者Qt平台本身......
  • ·跟着代码随想录刷力扣· ·数组部分· 2. 二分法
    leetcode题目:704二分法一、回顾顺序搜索(一)无序列表的顺序搜索,时间复杂度O(n)defsearch(self,nums:List[int],target:int)->int:pos=0whilepos<len(nums):ifnums[pos]==target:returnpos......
  • LeetCode 704.二分查找
    一、题目二、解题注:本文均是Java代码1、双闭区间写法classSolution{publicintsearch(int[]nums,inttarget){intleft=0,right=nums.length-1;while(left<=right){intmiddle=(left+right)>>>1;......
  • 二分板子
    二分板子#include<iostream>constexprintN=100;intmain(){inta[N];intn;std::cin>>n;for(inti=0;i<n;i++)std::cin>>a[i];intl=0,r=n-1;intt;std::cin>>t;while(l<r){......
  • 网页前端之html表单相关属性
                      表单input标签和表单相关属性        学习过HTML的朋友都会了解到,想要制作一个表单,我们首先要有一个最外层的容器来容纳我们用HTML所写的编程语句,所以今天我们所学的第一个HTML标签就是<form>标签。  ......
  • 一些fpga相关的知识
    一、什么是LUT?二、芯片型号命名的意义 比如我用的是xc7a35tfgg484-2,那么它每一部分的意思是: 三、blockram ......
  • 代码随想录算法训练营第一天 | 704.二分查找、27.移除元素
    704.二分查找文档讲解:代码随想录(https://www.programmercarl.com/)视频讲解:https://www.bilibili.com/video/BV1fA4y1o715/状态:704有思路但是不完善题目给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下......
  • 二分答案跳石头游戏
    步骤: 输入:用户输入了三个整数,分别表示石头的总长度l,石头的数量n,以及最多可以撤去的石头数量m。初始化石头位置数组:创建一个长度为n+2的数组arr,用于存储每块石头的位置。数组的第一项和最后一项分别表示起点和终点的位置,因此初始化为0和l。计算最小相邻石头间距:循环......
  • 基本线段树以及相关例题
    1.线段树的概念线段树是一种二叉树,也就是对于一个线段,我们会用一个二叉树来表示。这个其实就是一个线段树,我们会将其每次从中间分开,其左孩子就是左边的集合的和,其右孩子就是右边集合的和;我们可以用一个结构体tree去表示线段树的结点,tree.L代表线段树左边界,tree.R代表线段......