二分图最大匹配及最大权匹配

article/2025/9/17 10:11:52

二分图最大匹配学习

  • 一.二分图的基本知识
  • 二.二分图最大匹配
    • 什么是二分图最大匹配
    • 怎么求二分图最大匹配
  • 三.二分图最大权匹配
  • 四.例题训练
    • 三.最小点覆盖数

一位大佬的神级解释

本以为有了网络流,就不用再学匈牙利了,但在做题的过程中,发现有些题不能用网络流做,而只能用匈牙利做。迫不得已,只能来学匈牙利了。

一.二分图的基本知识

1.定义

  • G=(V, E)是一个无向图,若能将V分割成两个互不相关的点集X,Y,且图中每条边连接的两个顶点一个在 X中,另一个在 Y中,则称图G为二分图

在这里插入图片描述
2.性质与判定

  • 定理:当且仅当无向图G的每一个环的结点数均是偶数时,图G才是一个二分图。如果无环,相当于每的结点数为 0,故也视为二分图。

判定方法:dfs23染色法

  • 过程:我们把X部的结点颜色设为2,Y部的颜色设为3。
  • 从某个未染色的结点u开始跑dfs。把u染为0,枚举u的儿子v。如果v未染色,就染为与u相反的颜色,如果已染色,则判断u与v的颜色是否相同,相同则不是二分图。
  • 如果一个图不连通,则在每个连通块中作判定。

代码如下:(链式前向星存图)

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
const int M=N*N*2;
struct ppp{int u,v,next;
}e[M];
int vex[N],vis[N],k,flag=1;void add(int u,int v){k++;e[k].u=u;e[k].v=v;e[k].next=vex[u];vex[u]=k;
}
void dfs(int u){for(int i=vex[u];i;i=e[i].next){int v=e[i].v;if(vis[v]==0){vis[v]=vis[u]^1;dfs(v);}else if(vis[v]==vis[u]){flag=0;}}
}
int main(){int n,m,u,v;cin>>n>>m;for(int i=1;i<=m;i++){cin>>u>>v;add(u,v);}for(int i=1;i<=n;i++){if(!vis[i]){vis[i]=2; dfs(i);}} return 0;
} 

二.二分图最大匹配

什么是二分图最大匹配

  • 定义二分图两部分的点分别称为左部点和右部点。
  • 一张图的匹配是一些没有公共端点的边,最大匹配即没有公共端点的边的边数。
  • 可以想象,对于一个二分图而言,显然一个匹配是对于每一个左部点,连一条边向一个右部点,或者不向右部点连边。但是每个左部点不会对应两个或以上的右部点。

怎么求二分图最大匹配

方法1:匈牙利算法

  • 枚举每一个左部点u ,然后枚举该左部点连出的边,对于一个出点v,如果它没有被先前的左部点匹配,那么直接将u 匹配v,否则尝试让v的“原配”左部点去匹配其他右部点,如果“原配”匹配到了其他点,那么将u 匹配v,否则u 失配。
  • 尝试让“原配”寻找其他匹配的过程可以递归进行。需要注意的是,在一轮递归中,每个右部点只能被访问一次。
  • 个人理解匈牙利算法:判断是否能匹配第 i 个人,是在之前的所有匹配成功的左部点不会匹配不到人的前提下,尝试能不能让第 i 个点匹配到人。
  • 时间复杂度:O(nm)

代码实现如下

#include <bits/stdc++.h>
using namespace std;
const int N=1005;
struct ppp{int u,v,next;
}e[N*N]; 
int n1,n2,m;
int cp[N],vis[N],vex[N],k;void add(int u,int v) {k++;e[k].u=u;e[k].v=v;e[k].next=vex[u];vex[u]=k;
}int dfs(int u,int tag) {//tag为时间戳,保证每次dfs点不重复经过 if(vis[u]==tag)return 0; vis[u]=tag;for(int i=vex[u];i;i=e[i].next){int v=e[i].v;if(!cp[v]||dfs(cp[v],tag)){//如果喜欢的人单身,直接在一起//如果喜欢的人有对象,让他对象再找一个对象;//1.如果找得到,喜欢的人的对象换掉,喜欢的人成为自己的对象//2.如果找不到,这个喜欢的人就没机会了(找下一个喜欢的人) cp[v]=u;return 1;}}return 0;
}int main() {int u,v;cin>>n1>>n2>>m;for (int i=1;i<=m;i++) {cin>>u>>v;add(u,v);}int ans=0;for (int i=1;i<=n1;i++) {if (dfs(i, i))++ans;//让左部点 i去找对象 }cout<<ans;return 0;
}

方法2:转化为最大流模型

  • 将源点与左端点连条容量为1的边,右端点向汇点连一条容量为1的边,左部点与右部点连一条容量为1的边。那么二分图的最大匹配就是网络流的最大流。

一些定理:

  • 最小点覆盖:即最少的点去覆盖所有的边。
    方法:最小点覆盖等于最大匹配数
  • 最大独立集:选最多的点,满足两两之间没有边相连。
    方法:最大独立集等于 n - 最大匹配数

三.二分图最大权匹配

什么是二分图最大权匹配

  • 边附上了边权。在最大匹配下,求边权和最大的匹配。

方法:转化为最小费用最大流模型(自行转最大费用最大流)

  • 源点向左部点连一条容量为1,费用为0的边。左部点向右部点连一条容量为1,费用为边权的边。右部点向汇点连一条容量为,费用为0的边。跑最小费用最大流模板

四.例题训练

主要还是考建模能力

例题1
例题2

  • 例题1:让人跟床做完全匹配即可
  • 例题2:让外籍飞行员和英国飞行员求最大匹配即可(更模板)

例题3
这就是我说的那道网络流不行的题

  • 问题分析:使用匈牙利算法。建模:让属性值a,b,分别连向同一个右部点,保证这两个值不会同时匹配在同一个右部点上。让攻击序列作为左部点,去和武器属性做匹配。匈牙利的过程中若第 i 个点没有匹配,则婷婷。(这个点就是网络流做不到的地方,匈牙利可以挨个去判断第 i 个点是否能匹配到点)。

三.最小点覆盖数

  • 对于一个二分图,求其的最小点覆盖数,即用最少的点覆盖所有的边。

定理:最小点覆盖数等于最大匹配数

扩展:最小边覆盖=最大独立集=总节点数-最大匹配数


http://chatgpt.dhexx.cn/article/vlfG6Iyj.shtml

相关文章

二分图最大匹配问题(匈牙利算法)

什么是二分图 如果一个无向图的的顶点可以分为两个互不相交的子集A和B&#xff0c;那么它就是二分图。也就是说&#xff0c;A、B内部不存在连边&#xff0c;所有连边都一头连着A中的顶点&#xff0c;另一头连着B中的顶点。 什么是二分图最大匹配&#xff1f; 二分图最大匹配…

二分图 二分图最大匹配

首先来说一下什么是二分图。 二分图 二分图又称作二部图&#xff0c;是图论中的一种特殊模型。 设G(V, E)是一个无向图。如果顶点集V可分割为两个互不相交的子集X和Y&#xff0c;并且图中每条边连接的两个顶点一个在X中&#xff0c;另一个在Y中&#xff0c;则称图G为二分图。…

二分图最大匹配(最大流)

先举个例子&#xff0c;有N台计算机和K个任务&#xff0c;每个计算机只能执行一个任务&#xff0c;但可以执行多种任务。现在给出N和K&#xff0c;和其关系&#xff0c;求出最多能处理的任务数。 这就是典型的二分图&#xff0c;整张图被分为两半&#xff0c;一半是电脑&#…

图论总结(一)二分图最大匹配

二分图最大匹配 (一)、二分图 1、定义2、性质3、判定(二)、二分图的匹配 1、二分图的最大匹配2、 Knig定理及其证明3、最小边覆盖与最大独立集(三)、增广路径 1、定义2、性质3、寻找增广路(四)、匈牙利算法 1、找增广路经的算法2、实践3、算法分析(五)、例题 1、最小…

二分图的最大匹配

一、概念&#xff1a; 二分图&#xff1a;简单来说&#xff0c;如果图中点可以被分为两组&#xff0c;并且使得所有边都跨越组的边界&#xff0c;则这就是一个二分图。准确地说&#xff1a;把一个图的顶点划分为两个不相交集 U 和V &#xff0c;使得每一条边都分别连接U、V中的…

二分图最大匹配问题

最近在做的打车项目中&#xff0c;涉及到了用户叫单后&#xff0c;将所有出单司机和所有订单匹配的问题&#xff0c;借此来学习一下二分图的匹配算法。 一、无权二分图最大匹配 首先要区分一下各个概念&#xff1a; 匹配&#xff1a;图G的一个匹配是由一组没有公共端点的不是…

二分图最大匹配——匈牙利算法

二分图最大匹配 &#xff08;一&#xff09;、二分图的介绍1、定义2、充要条件 &#xff08;二&#xff09;、二分图的匹配1、二分图的最大匹配2、增广路径3、匈牙利算法&#xff08;1&#xff09;、复杂度&#xff08;2&#xff09;、算法思路&#xff08;3&#xff09;、代码…

B树最小高度和最大高度的推导

B树最小高度和最大高度的推导 对任意一棵包含n个关键字&#xff0c;高度为h&#xff0c;阶数为m的B树&#xff0c;其最小高度和最大高度的推导过程如下&#xff1a;

算法篇:树之树的高度

算法&#xff1a; 这一类题目很简单&#xff0c;不过却是树的最基本操作之一&#xff0c;引申为判断树是不是平衡二叉树。 一般做法是&#xff0c;计算二叉树的左右子树的高度1&#xff0c;然后取它们的最大值或者最小值。 题目1: https://leetcode-cn.com/problems/balanced-b…

【二叉树】最小高度树

0x00 题目 给定一个 有序 整数数组 元素各不相同且按 升序 排列 编写一个算法&#xff0c;创建一棵 高度最小 的二叉 搜索 树 给定有序数组: [-10,-3,0,5,9] 一个可能的答案是&#xff1a;[0,-3,9,-10,null,5] 它可以表示下面这个高度平衡二叉搜索树&#xff1a; 0 / \ -3 …

常见数据结构详细图解、树的高度、深度、层数、跳表、二叉搜索树、平衡二叉树、红黑树、B树、B+树

常见数据结构 常用的数据结构知识。 1.1 跳表 上图是一个有序链表&#xff0c;我们要检索一个数据就挨个遍历。如果想要再提升查询效率&#xff0c;可以变种为以下结构&#xff1a; 现在&#xff0c;我们要查询11&#xff0c;可以跳着来查询&#xff0c;从而加快查询速度。 …

树的高度 递归法和非递归法

递归法思路&#xff1a; 树的高度即节点子树的高度1&#xff08;节点子树的高度即左子树高度&#xff0c;右子树高度的最大值&#xff09; 代码如下&#xff1a; // Height_Recursive 递归法求树的高度 int Height_Recursive(TreeNode* pTree) {if (pTree NULL) {return 0;…

获取树高度的两种方法与完全二叉树的判断

树的高度 树的高度是节点高度的最大值。 每一层节点的高度如图所示。 方法一&#xff1a;递归 根节点的高度显然就是二叉树的高度。 /** * 获取树的高度* return*/ public int height(){return height2(root); }/*** 使用递归方法获取树的高度* param node* return*/ priv…

红黑树

一.简介 红黑树作为一种二叉搜索树的一种实现&#xff0c;红黑树的左右子树高度差可能大于 1。所以红黑树不是严格意义上的平衡二叉树&#xff08;AVL&#xff09;&#xff0c;但红黑树是黑色节点完美平衡&#xff0c; 其平均统计性能要强于 AVL 。 红黑树是每个节点都带有颜…

B树最大高度推导

文章目录 B树最大高度推导推导B树的最小高度推导最大高度 B树&#xff1a;MySQL数据库索引是如何实现的&#xff1f;1. 遇到问题2. 尝试用学过的数据结构解决这个问题3. 改造二叉查找树4. 索引的弊端 B树最大高度推导 【声明几个重要概念】 B树的关键字就是要查找的东西 B树…

红黑树详解

1&#xff0c;红黑树特点 每一个结点都有颜色&#xff0c;要么红色&#xff0c;要么黑色。根结点必须是黑色的。红色结点的子结点必须是黑色的。任何一个结点&#xff0c;到它所有叶子结点&#xff0c;经过相同个数的黑色结点。&#xff08;红黑树的平衡含义&#xff0c;左右高…

MYSQL的B+Tree索引树高度如何计算

我们使用MySQL数据库的时候&#xff0c;绝大部分的情况下在使用InnoDB存储引擎&#xff0c;偶尔会使用MyISAM存储引擎&#xff0c;至于其他存储引擎&#xff0c;我相信大家都很少接触到&#xff0c;甚至可能都没有听说过。所以本文只讲解InnoDB和MyISAM两个存储引擎的索引&…

红黑树高度上限的证明(通俗易懂)

先把结论放上&#xff0c;设红黑树的高度为h&#xff0c;总结点数为n&#xff0c;那么h与n的关系就是 下面开始证明过程 首先&#xff0c;从任意节点出发&#xff0c;到其子树的叶子节点的路径中黑色节点的数量称为该节点的黑高&#xff0c;即 bh 我们设根节点为T,那么根节点…

数据结构与算法(一): 树的高度和深度的区别

1.高度 对于高度的理解&#xff0c;我们不管他数据结构什么什么知识&#xff0c;就拿楼房来说&#xff0c;假如一个人提问&#xff1a;楼房的高度有好高&#xff1f;我们会下意识的从底层开始往上数&#xff0c;假如楼有6层&#xff0c;则我们会说&#xff0c;这个楼有6层楼那…

经典PID算法

首先感谢黄工&#xff0c;公众号strongerHuang&#xff0c;以下为三篇文章整合而成。 文章链接&#xff1a; https://mp.weixin.qq.com/s/6Ew431m4nXhScpNVp8mGxQ https://mp.weixin.qq.com/s/JYWnu67HEx2uMrntcUhggQ https://mp.weixin.qq.com/s/IrTehHvTofXWP_BapoN1NQ 在工…