首页 > 其他分享 >二分图

二分图

时间:2022-10-07 07:55:05浏览次数:39  
标签:二分 匹配 覆盖 int 最小 st

二分图的判定

不存在奇数环。
可以通过匈牙利算法,染色判定。

bool dfs(int x,int t)
{
	st[x]=t;
	for(int i=head[x];i;i=ne[i])
	{
		int y=ver[i];
		if(!st[y])
		{
			if(!dfs(y,3-t)) return 0;
		}
		else if(st[y]==st[x]) return 0;
	}
	return 1;
}

最大匹配 最坏O(N^2 M)

任意两条边都没有公共点的边的集合。

for(int i=1;i<=n;i++)
{
	memset(st,0,sizeof(st));
	if(find(i)) res++;
}

bool find(int x)
{
	for(int i=1;i<=n;i++)
	{
		if(!st[i]&&g[x][i])
		{
			st[i]=1;
			int t=match[i];
			if(t==0||find(t))
			{
				match[i]=x;
				return 1;
			}
		}
	}
	return 0;
}

最小点覆盖

定义:给定一张二分图用最少的点覆盖所有边。
定理:二分图的最小点覆盖等于最大匹配边数。


证明:最大匹配的边是二分图边集的一个子集,所以至少从匹配点中选择一个,只需要构造一组点覆盖,使得等于匹配边数即可。

从左边所有非匹配点出发,寻找增广路径并标记经过的点(必然失败,否则必然有更大的点匹配,即不可能经过右边的非匹配点),其到达的必然是右边的匹配点,并且一定能到达对应的左边的匹配点。

匹配点要么都经过,要么都不经过。

然后验证覆盖所有边。

取左边未标记的匹配点和右边标记过的匹配点,即可得到最大匹配。
所有匹配边都经过。我们从左边非匹配点出发,到达右边的匹配点,右边的非匹配点必然不能到达,所以非匹配边都被经过。

证毕。


最大独立集

定义:任意两点不能互相到达的点的最大集合
定理:最大独立集=n-最小点覆盖=n-最大匹配
最大独立集=删去最少的点,使得剩余的点没有边=删除最小点覆盖


有向无环图的最小路径点覆盖

定义:用最少的边覆盖所有点
定理:最小路径点覆盖=n-最小点覆盖=n-最大匹配

将有向无环图的点进行拆分,分为入点和出点,显然每个点的入度出度不超过1,最小路径点覆盖=图的出度为0的点最多

标签:二分,匹配,覆盖,int,最小,st
From: https://www.cnblogs.com/mrkou/p/16759035.html

相关文章

  • Java二分查找代码实现
    Java二分查找代码实现及原理简要分析代码原理描述前提:已经有一个排好序的数组(否则需要先排序)定义左边界left,右边界right,确定搜索范围,循环执行二分查找(第3、4步骤)......
  • CF1415D XOR-gun 题解 二分答案/贪心
    题目链接https://codeforces.com/problemset/problem/1415/D题目大意给定一个长为\(n\)的不降序列,每次操作可以任选相邻的两个数,并将这两个数替换为两个数按位异或的......
  • 前端程序员学习 Golang gin 框架实战笔记之二分析 context
    上一节:前端程序员学习Golanggin框架实战笔记之一开始玩gin之前讲到了如何使用gin,这一节我们来分析和调试一下它的代码。New()第一行的gin.New(),其实还有一种......
  • 算法突破:二分查找
    LeetCode75学习计划适用于想为技术面试做准备但不确定应该聚焦于哪些题目的用户。学习计划中的题目都是经过精心挑选的,Level1和Level2学习计划是为初级用户和中级用户......
  • LeetCode 07 - 二分查找
    注意几个点:区间的确定:一般写成闭区间[left=0,right=n-1]。循环条件的确定:因为使用闭区间,所以left==right在区间中是有意义的,所以循环条件为while(left<=right)......
  • 二分
    y总二分模板y总模板链接boolcheck(intx){/*...*/}//检查x是否满足某种性质//区间[l,r]被划分成[l,mid]和[mid+1,r]时使用:intbsearch_1(intl,intr){......
  • java算法——二分法及其拓展
    题目描述:在一个无序数组中,任何相邻的两个数一定不相等,求规定范围内它局部最小的那个数要求:计算的过程时间复杂度小于O(N)思路:由于所有相邻的两个数一定不相等,若一个数的左......
  • 二分查找算法的起步判定优化
    packagecom.example.grokkingalgorithmsdemo.binarysearch;importlombok.extern.slf4j.Slf4j;/***@Author:Frank*@Date:2022-06-0412:12*/@Slf4jpublicclassBin......
  • 二分查找算法
    二分查找算法又叫做折半查找,要求待查找的序列有序,每次查找都取中间的值与待查关键字进行比较,如果中间位置的值比待查关键字大,则在序列的左半部分继续执行该查找过程,如......
  • 二分法的四个简单应用
    一.寻找有序数组中的元素--寻找一个有序数组中的某个元素,并输出其下标//寻找有序数组中的某个元素#include<stdio.h>intmain(){intarr[]={-1,2,4,5,7,8,9,11};int......