二分图最大独立集&最小路径点覆盖

【最小边覆盖 & 最小路径覆盖 & 最小顶点覆盖 & 最大独立集 & 最大团】 最小边覆盖 = 最大独立集 = |V| - 最大匹配数 这个是在原图是二分图上进行的 最小路径覆盖和最小边覆盖不同,不要求给的图是二分图,而是要求是N x N的有向图,不能有环,然后根据原图构造二分图,构造方法是将点一分为二,如,i分为i1和i2然后如果i和j有边,那么就在i1和j2之间连一条边。由此构成二分图 然后最小路径覆盖 = n-m,n为原图的点的个数,m为新造二分图 阅读详情

一.二分图最大独立集

定义:

对于一张无向图 G ( V , E ) G(V,E) G(V,E),选出一个 V V V的子集 S S S,使得 S S S中任意两点之间都没有边,且 S S S是最大这样的子集。

求解方法:

二分图的最大独立集的点的数量=总点数N-最大匹配

简单的证明:要使得独立集越大,那么删掉的点就要越少,同时话要保证删掉的点覆盖到所有边,所以删掉的因该是最小点覆盖。

例题:

Example1:[LGOJ]P3355 骑士共存问题:

总结:
  • 能攻击的点,颜色都是不一样的,颜色一0样就意味着不冲突,一定可以放骑士。
  • 这是一张“二分图”,如果我们把冲突的两个格子连边,相当于隔开。
  • 每一个格子都是一个点,而每个格子只能放一个骑士,能选出来多少格子,最大独立集就是骑士的数量
    所以答案为 n ∗ n − m − n*n-m- n∗n−m−最大匹配数

注意奇数建图&偶数建图的差距,奇数建图会TLE!!!

代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000005;
const int maxm=5005;
const int dx[8]={-1,-2,-2,-1,1,2,2,1};
const int dy[8]={-2,-1,1,2,2,1,-1,-2};
int n,m,tot,ans;
bool ban[maxm][maxm],vis[maxn];
int match[maxn],head[maxn];
vector<int> nd;
struct node
{
	int from,next,to;
}edge[maxn];
inline int read()
{
	int s=0,f=1;
	char c=getchar();
	while (c<'0'||c>'9')
	{
		if (c=='-')
		{
			f=-1;
		}
		c=getchar();
	}
	while (c>='0'&&c<='9')
	{
		s=s*10+c-48;
		c=getchar();
	}
	return s*f;
}
inline void add(int x,int y)
{
	edge[++tot].next=head[x];
	edge[tot].from=x;
	edge[tot].to=y;
	head[x]=tot;
}
inline bool dfs(int u)
{
	for (int i=head[u];i;i=edge[i].next)
	{
		int v=edge[i].to;
		if (!vis[v])
		{
			vis[v]=1;
			if (match[v]==-1||dfs(match[v]))
			{
				match[v]=u;
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
	n=read(),m=read();
	int x,y;
	for (int i=1;i<=m;i++)
	{
		x=read(),y=read();
		ban[x][y]=1;
	}
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j++)
		{
			if (!ban[i][j]&&(i+j)%2)
			{
				nd.push_back(n*(i-1)+j);
				for (int k=0;k<8;k++)
				{
					int cur_x=i+dx[k],cur_y=j+dy[k];
					if (cur_x<1||cur_x>n||cur_y<1||cur_y>n)
					{
						continue;
					}
					if (!ban[cur_x][cur_y])
					{
						add(n*(i-1)+j,n*(cur_x-1)+cur_y);
					}
				}
			}
		}
	}
	memset(match,-1,sizeof(match));
	for (int i=0;i<nd.size();i++)
	{
		memset(vis,0,sizeof(vis));
		ans+=dfs(nd[i]);
	}
	cout<<n*n-m-ans;
	return 0;
}
/*
TLE72pts
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
const int maxm=2000005;
int dx[9]={1,1,2,2,-1,-1,-2,-2};
int dy[9]={2,-2,1,-1,2,-2,1,-1};
int n,m,k,tot=-1,cnt,ans;
int head[maxm],match[maxm],num[maxn][maxn];
bool vis[maxm],ban[maxn][maxn];
struct node
{
	int from,to,next;
}edge[maxm];
inline int read()
{
	int s=0,f=1;
	char c=getchar();
	while (c<'0'||c>'9')
	{
		if (c=='-')
		{
			f=-1;
		}
		c=getchar();
	}
	while (c>='0'&&c<='9')
	{
		s=s*10+c-48;
		c=getchar();
	}
	return s*f;
}
void add(int x,int y)
{
	edge[++tot].next=head[x];
	edge[tot].from=x;
	edge[tot].to=y;
	head[x]=tot;
}
bool dfs(int u)
{
	for (int i=head[u];i;i=edge[i].next)
	{
		int v=edge[i].to;
		if (!vis[v])
		{
			vis[v]=1;
			if (!match[v]||dfs(match[v]))
			{
				match[v]=u;
				return true;
			}
		}
	}
	return false;
}
int main()
{
	n=read(),m=read();
	for (int i=1;i<=m;i++)
	{
		int x=read(),y=read();
		ban[x][y]=1;
	}
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j++)
		{
			num[i][j]=++cnt;
		}
	}
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j++)
		{
			if (ban[i][j])
			{
				continue;
			}
			else
			{
				for (int k=0;k<8;k++)
				{
					int cur_x=i+dx[k],cur_y=j+dy[k];
					if (cur_x>0&&cur_x<=n&&cur_y>0&&cur_y<=n&&!ban[cur_x][cur_y])
					{
						add(num[i][j],num[cur_x][cur_y]);
						add(num[cur_x][cur_y],num[i][j]);
					}
				}
			}
		}
	}
	for (int i=1;i<=cnt;i++)
	{
		memset(vis,0,sizeof(vis));
		if (dfs(i))
		{
			ans++;
		}
	}
	cout<<(n*n)-m-(ans/2)<<endl;
	return 0;
}
*/

Example2: [LGOJ]P5030 长脖子鹿放置

很显然这是一个二分图最大独立子集问题,由题面很容易联想到[LGOJ]P3355 骑士共存问题。但是那题的建图方式显然不能照搬。我们考虑按照行的奇偶性建立二分图。(列的奇偶性也可以)

在这里插入图片描述
因为长脖子鹿只能跳到当前行-3,-1,+1,+3这四行中的任意一行,所以我们可以得出:
长脖子鹿仅能从奇数行跳到偶数行和从偶数行跳到奇数行。
通过这个性质我们对棋盘稍加改造(按照行的奇偶性染色):
在这里插入图片描述
我们将能互相攻击到的格子进行连边,这样建出来的图显然满足二分图的定义
因为骑士共存问题可以用图的遍历顺序优化+匈牙利水过去,这是我们就可以用图的遍历顺序优化+匈牙利水过去,时间复杂度为O(能过)

代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000005;
const int maxm=1005;
int n,m,e,tot,ans;
int head[maxn],match[maxn],vis[maxn],obstacle[maxm][maxm];
int dx[8]={-3,-3,-1,-1,1,1,3,3};
int dy[8]={-1,1,-3,3,-3,3,-1,1};
struct node
{
	int from,to,next;
}edge[maxn];
inline int get_pos(int x,int y)
{
	return (x-1)*m+y;
}
inline int add(int x,int y)
{
	edge[++tot].next=head[x];
	edge[tot].from=x;
	edge[tot].to=y;
	head[x]=tot;
}
inline int read()
{
	int s=0,f=1;
	char c=getchar();
	while (c<'0'||c>'9')
	{
		if (c=='-')
		{
			f=-1;
		}
		c=getchar();
	}
	while (c>='0'&&c<='9')
	{
		s=s*10+c-48;
		c=getchar();
	}
	return s*f;
}
inline bool dfs(int x)
{
	for (int i=head[x];i;i=edge[i].next)
	{
		int y=edge[i].to;
		if (vis[y]==false)
		{
			vis[y]=true;
			if (match[y]==0||dfs(match[y])==true)
			{
				match[y]=x;
				return true;
			}
		}
	}
}
int main()
{
	n=read(),m=read(),e=read();
	for (int i=1;i<=e;i++)
	{
		int x=read(),y=read();
		obstacle[x][y]=1;
	}
	for (int i=1;i<=n;i+=2)
	{
		for (int j=1;j<=m;j++)
		{
			if (obstacle[i][j])
			{
				continue;
			}
			for (int k=0;k<8;k++)
			{
				int cur_x=i+dx[k],cur_y=j+dy[k];
				if (cur_x<1||cur_y<1||cur_x>n||cur_y>m||obstacle[cur_x][cur_y])
				{
					continue;
				}
				add(get_pos(i,j),get_pos(cur_x,cur_y));
			}
		}
	}
	for (int i=1;i<=n;i+=2)
	{
		for (int j=1;j<=m;j++)
		{
			if (!obstacle[i][j])
			{
				memset(vis,0,sizeof(vis));
				ans+=dfs(get_pos(i,j));
			}
		}
	}
	cout<<n*m-e-ans<<endl;
	return 0;
}
/*
8 7 5
1 1
5 4
2 3
4 7
8 3
*/

二.最小路径点覆盖

定义:

对于一张有向无环图DAG,用最少的简单路径(没有重复经过点的)覆盖所有点。每一个点恰好被覆盖一次。这样的问题就是有向无环图的最小路径点覆盖

解法:

如何求DAG的最小路径点覆盖

  • 首先将原图的每一个点拆成 x x x和 ( x + n ) (x+n) (x+n),这样就可以分成 1 − n 1-n 1−n和 n + 1 n+1 n+1到 2 n 2n 2n两个点集
  • 然后,在原图中 x − > y x->y x−>y的这条边,转换成 x − > ( y + n ) x->(y+n) x−>(y+n),得到一张新图 G ′ G' G′
  • 原图的最小路径点覆盖== N − G ′ N-G' N−G′的最大匹配

例题:

Example1:[LGOJ]P2764 最小路径覆盖问题

给定有向图 G = ( V , E ) G = ( V , E ) G=(V,E)G=(V,E) G=(V,E)G=(V,E) 。设 P P P 是 G G G 的一个简单路(顶点不相交)的集合。如果 V V V 中每个定点恰好在PP的一条路上,则称 P P P 是 G G G 的一个路径覆盖。 P P P中路径可以从 V V V 的任何一个定点开始,长度也是任意的,特别地,可以为 0 0 0 。 G G G 的最小路径覆盖是 G G G 所含路径条数最少的路径覆盖。设计一个有效算法求一个 G A P GAP GAP (有向无环图) G G G 的最小路径覆盖。

提示:设 V = { 1 , 2 , . . . , n } V = 1 , 2 , . . . , n V=\{1,2,...,n\}V={1,2,...,n} V={1,2,...,n}V=1,2,...,n 构造网络 G 1 = { V 1 , E 1 } G_1=\{V_1,E_1\} G1​={V1​,E1​}如下
V 1 ​ = x 0 ​ , x 1 ​ , . . . , x n ​ ∪ y 0 ​ , y 1 ​ , . . . , y n ​ V1 ​ ={x 0 ​ ,x 1 ​ ,...,x n ​ }∪{y 0 ​ ,y 1 ​ ,...,y n ​ } V1​=x0​,x1​,...,xn​∪y0​,y1​,...,yn​
E 1 ​ = ( x 0 ​ , x i ​ ) : i ∈ V ∪ ( y i ​ , y 0 ​ ) : i ∈ V ∪ ( x i ​ , y j ​ ) : ( i , j ) ∈ E E 1 ​ ={(x 0 ​ ,x i ​ ):i∈V}∪{(y i ​ ,y 0 ​ ):i∈V}∪{(x i ​ ,y j ​ ):(i,j)∈E} E1​=(x0​,xi​):i∈V∪(yi​,y0​):i∈V∪(xi​,yj​):(i,j)∈E
每条边的容量均为 11 ,求网络 G 1 G_1 G1​的 ( x 0 , y 0 ) (x_0,y_0) (x0​,y0​) 最大流。

输入格式
第一行有 2 2 2 个正整数 n n n 和 m m m 。 n n n 是给定 GAP \text{GAP} GAP(有向无环图) G G G 的顶点数, m m m 是 G G G 的边数。接下来的 m m m 行,每行有两个正整数 i i i 和 j j j 表示一条有向边 ( i , j ) (i,j) (i,j)。

输出格式
从第1 行开始,每行输出一条路径。文件的最后一行是最少路径数。

Solution:

一道二分图的题,在网络流上体现为:最小路径覆盖=点的总数-网络最大流。在这里插入图片描述
拆点后源点向 1   n 1~n 1 n连接权为1的边, n + 1 − > 2 n n+1->2n n+1−>2n向汇点连权为1的边
对于原图中相连的两个点 x − > y x->y x−>y,二分图中体现为 x − > y + n x->y+n x−>y+n
最后的方案可以利用残量网络用并查集维护
即从 1 1 1到 n n n枚举,从每个点向外扫一圈,如果有流从这条边经过,并流向 y + n y+n y+n,则合并 x x x与 y y y
然后 n 2 n^2 n2输出方案即可。

二分图代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
const int maxm=1000005;
int n,m,tot,ans;
int head[maxn],match[maxn];
bool vis[maxn];
struct edge
{
	int from,next,to;
}edge[maxm];
inline int read()
{
	int s=0,f=1;
	char c=getchar();
	while (c<'0'||c>'9')
	{
		if (c=='-')
		{
			f=-1;
		}
		c=getchar();
	}
	while (c>='0'&&c<='9')
	{
		s=s*10+c-48;
		c=getchar();
	}
	return s*f;
}
void add(int x,int y)
{
	edge[++tot].next=head[x];
	edge[tot].from=x;
	edge[tot].to=y;
	head[x]=tot;
}
bool dfs(int x)
{
	for (int i=head[x];i;i=edge[i].next)
	{
		int v=edge[i].to;
		if (!vis[v])
		{
			vis[v]=1;
			if (!match[v]||dfs(match[v]))
			{
				match[x]=v;
				match[v]=x;
				return 1;
			}
		}
	}
	return 0;
}
void print(int x)
{
	x+=n;
	do
	{
		x=x-n;
		cout<<x<<" ";
	}while(vis[x]=1,x=match[x]);
	puts("");
}
int main()
{
	n=read(),m=read();
	for (int i=1;i<=m;i++)
	{
		int x=read(),y=read();
		add(x,y+n);
	}
	for (int i=1;i<=n;i++)
	{
		if (!match[i])
		{
			memset(vis,0,sizeof(vis));
			ans+=dfs(i);
		}
	}
	memset(vis,0,sizeof(vis));
	for (int i=1;i<=n;i++)
	{
		if (!vis[i])
		{
			print(i);
		}
	}
	cout<<n-ans<<endl;
	return 0;
}
最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转) 在讲述这两个算法之前,首先有几个概念需要明白: 二分图:  二分图又称二部图,是图论中的一种特殊模型。设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A, j in B), 则称图G是二分图。  匹配:  给定一个二分图,在G的一个子图G’中,如果G’的边集中的任意两条边都不... 阅读详情

相关推荐

图论中 [ 最小边覆盖/最小路径覆盖/最小顶点覆盖/最大独立集/最大团 ] 的概念与性质

基础概念: 点的概念 a.点覆盖集:无向图G的一个点集,使得该图中所有边都至少有一点端点在该集合内。 b.点独立集:无向图G的一个点集,使得任两个在该集合中的点在原图中不相邻。 最大独立集:点独立集中元素个数最大的独立集,那么此独立集元素个数k就是这个图的最大独立数。 c.最小点覆盖集:无向图G中点数最少的点覆盖集 d.最大点独立集:无向图G中,点数最多的点独立

Mr.Phoebe的专栏 6387

二分图带权最大独立集

问题:在一个二分图中,每个点都有一个权值,在保证选中的点不相交的情况下,求选出的点的最大权值和 解法:【最小割】 前提是能把图分成二分图,比如矩阵的格子点,同一侧的各个点不会有边相连。 源点向X集合连流量为权值的边,Y集合各点向汇点连流量为权值的边。 X与相连的Y连流量为INF的边。 对于任意一个割集,与割相连的点都删掉就会得到一个独立点集。(割边只能是源点到X,和Y到汇点的边) 因此

Song 3287

Harness设计——Anthropic实战:规划器、生成器、评估器三角色协作详解

本文探讨了如何通过多智能体架构突破AI编码的瓶颈问题。文章首先分析了当前AI编码面临的两大核心挑战:上下文窗口限制导致的连贯性丧失,以及自我评估机制缺失引发的质量判断偏差。针对这些问题,作者提出了基于生成对抗网络(GAN)灵感的解决方案,设计了三智能体系统:规划器负责需求分析,生成器执行编码任务,评估器进行质量审查。 实验表明,在前端设计任务中,通过制定可量化的评分标准(设计质量、原创性、工艺、功能性)并建立生成-评估反馈循环,能显著提升输出质量。这种架构随后被扩展到全栈开发领域,采用类似敏捷开发的&quo

oe1019的专栏 867

二分图的覆盖与独立集

本篇文章介绍了二分图的覆盖与独立集相关的概念、定义和算法实现方法,包括覆盖数、最小点覆盖、独立集、最大独立集、完美匹配、Hopcroft-Karp算法等内容。在学习二分图相关算法时,需要注意掌握相关概念和定义,并尽可能多地掌握不同的算法实现方法。同时,需要注重算法的时间复杂度和正确性,避免出现漏洞和错误。总之,学习二分图相关算法对于提高算法和数据结构的理解和应用能力非常有帮助,也是各类算法竞赛和编程面试中必备的知识点。如此重要的知识点,切勿急于求成,需要反复学习、练习和总结,才能真正掌握。

m0_72410588的博客 794

MTK平台 MT6789 烧录 efuse 3.0 Configuration SOP

=====================生成cert1和cert2 key===============================================生成efuse key相关文件===========================================签名DA==========================================================正常编译。=====================Security3.0 的SOP 说明。

a785722173的博客 2329

腾讯WeKnora开源了!手把手教你用Docker+Ollama本地部署多模态知识库(附避坑指南)

本文详细介绍了腾讯开源的多模态知识库工具WeKnora的本地部署方法,通过Docker和Ollama实现完全离线运行。文章包含环境准备、核心组件配置、Ollama模型集成、系统启动验证及高级性能调优等实战内容,特别适合需要构建私有化知识库的中小团队和个人开发者。

weixin_30664051的博客 479

二分图的覆盖

最小点覆盖,即用最少的点去覆盖所有的边。(只要一条边的一个节点被标记,那这一条边就被覆盖啦!)解法:二分图最小点覆盖包含的点数等于二分图最大匹配的边数。惊不惊喜意不意外!!!!思考一下会不会存在一种情况,使得一条边的两个点都被选择?当然有可能!主要还是难在构图的。来看俩题意思一下。poj1325:有两台computer及N个任务,每台computer有M种模式。对于每个任务给定a[i],b[i],...

呆头呆脑没有烦恼 692

告别懵圈!用CANoe手把手解析ISO15765多帧传输(附实战报文分析)

本文详细解析了ISO15765多帧传输协议在汽车电子诊断中的应用,通过CANoe实战演示了从首帧发送到流控协商再到连续帧传输的完整流程。文章包含嵌入式系统诊断协议的深度分析,特别适合UDS和CAN总线开发人员学习多帧传输机制及常见问题解决方案。

weixin_30813225的博客 281

二分图点权最大独立集和二分图最小点权覆盖集

二分图点权最大独立集:带点权二分图G中的一个子集V,其中一条边的两个端点不能同时属于V,且V中点权和最大。 点覆盖集:无向图G的一个点集,使得该图中所以边都至少有一个端点在该集合内。形式化的定时意思点覆盖集为V'∈V,满足对于所有的(u,v)∈E,都有u属于V'或v属于V'成立,即至少一个成立。形象的说是若干点“覆盖”住了与他们邻接的边。这些边恰好组成了原边集。 最小点覆盖集: 在无向图G...

常胜将军的博客 778

文献解读:结构方程模型SEM基础,小白看这个就基本够了

今天要解读的依然是一篇教学文献:The Basics of Structural Equation Modeling,文献作者是Diana Suhr, Ph.D. University of Northern Colorado。 文献链接: https://www.lexjansen.com/wuss/2006/tutorials/TUT-Suhr.pdf 结构方程模型是: 用来检验显变量与潜变量关系假设的综合性的统计技巧 用来表示,估计或者检验变量间理论关系的技巧 用来探究一系列潜变量和显变量因

Codewar的博客 6万+

Orange3实战教程:实例---文本分类

我们可以使用预测模型按作者、类型、情感等对文档进行分类。在此工作流中,我们根据文档的Aarne Thompshon Uther索引对文档进行归类,这是故事的主题定义。我们使用两个简单的学习器,Logistic回归和朴素贝叶斯,两者都可以在诺谟图中检查。然后再从可视化分类中添加列线图组件,观察哪些词对逻辑回归最重要。也可以尝试使用在朴素贝叶斯模型上,并编辑连线属性。再从模型中添加朴素贝叶斯模型,以尝试不同的学习器。

err2008的专栏 385

二分图最大独立集(最大团)

最大独立集的定义 二分图的最大独立集是:一个最大的点的集合,该集合内的任意两点没有边相连。 二分图最大团的定义是:一个最大的点的集合,该集合内的任意两点都有边相连。 从定义可以看出"二分图的最大独立集"和"二分图补图的最大团"是一样的。 最大独立集的求法 二分图的最大独立集 = 二分图顶点数 - 二分图最大匹配数。 设二分图的顶点数为n,最大匹配数是v。 二分图的最大独立集 =...

weixin_30481087的博客 647

Python爬虫教程:抓取区块链交易信息及加密货币市场数据

随着区块链技术和加密货币的迅猛发展,区块链交易和加密货币市场的数据逐渐成为金融、技术、经济研究等领域的热点。对于开发者和研究者而言,实时获取区块链交易数据和加密货币市场行情,对于投资分析、市场预测、技术研究等具有重要的参考价值。本文将通过Python爬虫技术,介绍如何抓取区块链交易信息及加密货币市场数据,详细阐述数据获取的原理、技术方案、实现方法以及抓取到的数据的存储与分析。我们将依托最新的爬虫技术,如requestsSeleniumScrapy,以及相关的数据处理库(如pandasmatplotlib。

2201_76125261的博客 2777

二分图中对最小顶点覆盖、最小边覆盖、最大独立集的理解

仅仅用于自己理解,若有共鸣,别太吐槽就行哈~ 首先是匈牙利算法的本质:(图参考了zxy的) 这个图要详细看完,那么刚开始我想的“找小三”实际上就是递归找增广路的过程,如果找到增广路,匹配数就一定可以加一。(代码就不上了,都是一个模板) 理解到这里其实才只是个开始,我想解决的是最大匹配与最小顶点覆盖数、最小边覆盖数、最大点独立集之间的关系是怎么得来的。首先是结论

Iguodala的博客 1万+

【PINN高级教程】范式融合与前沿应用 第5讲:贝叶斯推断与生成式建模的深度融合

正规化流(Normalizing Flow, NF)通过一系列可逆变换把简单分布映射为复杂后验,从而获得更好的表达能力。算子学习保持映射的物理正确性。贝叶斯推断给出了自然的框架,但直接对高维函数空间做采样(如 MCMC)几乎不可行。1️⃣ 在自己的 PDE 上跑一遍完整的 Bayesian PINN 流模型。的学习机制深度融合,以在保持物理一致性的前提下,高效地从后验分布中采样。2️⃣ 将每个 θ 直接映射到 FNO 权重,得到不同解的采样。的后验 p(θ∣x,y)p(θ∣x,y) 进行近似。

u012133341的博客 474

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

二分图相关定理及其证明(最小点覆盖+最小路径覆盖+最大独立集+最小覆盖集)

①最小路径覆盖: 给定有向图G=(V,E)。设P 是G 的一个简单路(顶点不相交)的集合。如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖。P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0。G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖。   路径覆盖和二分图匹配的关系: 最小路径覆盖=|G|-最大匹配数 上述公式中最大匹配数是这样来的:

lethalboy 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

二分图【判定、最大匹配、最小点覆盖、最小路径覆盖及例题】

一、最大匹配 定义:给定一个二分图G,在G的一个子图M中,M的边集E中的任意两条边都不交汇于同一个结点,则称M是一个匹配。选择边数最大的子图称为最大匹配问题\color{red}{ 定义:给定一个二分图G,在G的一个子图M中, M的边集{E}中的任意两条边都不交汇于同一个结点,则称M是一个匹配。选择边数最大的子图称为最大匹配问题 }定义:给定一个二分图G,在G的一个子图M中,M的边集E中的任意两条...

qq_43803508的博客 1149

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

二分图:最大独立集&最大匹配&最小顶点覆盖

最大独立集问题 Given N sets of integers, remove some sets so that the remaining all sets are disjoint with one another. Find the optimal solution so that the number of sets remaining at the end is maxim

不可不戒 4755

算法{二分图的最小点覆盖集,二分图的最大点独立集}

1

qq_66485519的博客 686

关于最大匹配,最小点覆盖,最少路径覆盖和最大独立集的总结

最小点覆盖: 点覆盖的概念定义: 对于图G=(V,E)中的一个点覆盖是一个集合S⊆V使得每一条边至少有一个端点在S中。 最小点覆盖:就是点覆盖中点的个数最少的集合S。 最小边覆盖: 边覆盖的概念定义: 边覆盖是图的一个边子集,使该图上每一节点都与这个边子集中的一条边关联,只有含孤立点的图没有边覆盖,边覆盖也称为边覆盖集,图G的最小边覆盖就是指边数最少的覆盖,图G的最小边覆盖的边数称为G的边...

vocaloid01的博客 4021

【图论】二分图的应用(染色法判断二分图,最大匹配,最小点覆盖,最大独立集,最小路径点覆盖,最小路径重复点覆盖)

目录概念什么是二分图?二分图的判定匹配问题名词概念匈牙利算法染色法判断二分图-关押罪犯最大匹配-棋盘覆盖最小点覆盖-机器任务最大独立集-骑士放置最小路径重复点覆盖-捉迷藏 概念 什么是二分图? 顾名思义就是能分成两个部分的图 二分图是一个图,它的顶点可以分为两个独立的集合UUU和VVV,这样每一条边(u,v)(一个点在UUU,一个点在VVV)要么从uuu到vvv连接一个顶点,要么从vvv到uuu连接一个顶点。换句话说,对于每一条边(u,v),要么uuu属于UUU,要么vvv属于VVV,或者uuu属于VVV,

a碟的博客 1196

二分图 (最大匹配 + 最小点覆盖 + 最少路径覆盖 + 最大独立集)

最大匹配 匈牙利算法。 最小点覆盖 概念:用最少的点,让每条边都至少和其中的一个点关联 König定理:一个二分图中的最大匹配数等于该图的最小顶点覆盖数。 最小点覆盖 = 最大匹配。 证明:这里 最少路径覆盖(不相交路径) 概念:在一个有向图中,找出最少的路径,使得这些路径经过其中每个点,且每个点只与一条路径相关联。 方法:最少路径覆盖 = 点数 - 二分图最大匹配 。 证明:设点数为 n ,最大匹配数为 m,因为我们要让路径尽量少,先设每个点即一条路径,然后一个匹配可以连接两个点,即.

hachuochuo_的博客 1037

二分图的最大匹配,点覆盖集,边覆盖集,最大独立集,最大团

参考 【2018五一清北培训】【2】【二分图以及匈牙利算法】 二分图最大匹配总结——kuangbin的ACM博客 关于最大匹配,最小点覆盖,最少路径覆盖和最大独立集的总结 二分图的最大匹配 二分图:对于一个图G=(V,E),若能将其点集分为两个互不相交的两个子集X、Y,使得X∩Y=∅,且对于G的边集V,若其所有边的顶点全部一侧属于X,一侧属于Y,则称图G为一个二分图。 二分图判定:无奇环,可以用...

秋叶红于二月花 1212

( 图论专题 )【 最小点覆盖、最少边覆盖和最大独立集 】

( 图论专题 )【 最小点覆盖、最少路径覆盖和最大独立集 】 (1)二分图的最大匹配 匈牙利算法 (2)二分图的最小点覆盖 定义:在二分图中,求最少的点集,使得每一条边至少都有端点在这个点集中。 二分图的最小点覆盖 = 二分图的最大匹配 (3)二分图的最少边覆盖 定义:在二分图中,求最少的边,使得他们覆盖所有的点,并且每一个点只被一条边覆盖。 二分图的最少边覆盖 = 点数-二分图的最大匹配 证明: 先贪心选一组最大匹配的边放进集合,对于剩下的没有匹配的点,随便选一条与之关联的边放进集.

石旭先森的博客 3673
上一篇: dp复习---之01背包(第一章)
下一篇: Ural1100 Final Standings
Modestr-E·X·L
博客等级 码龄7年 5粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值