首页 > 编程语言 >二分图最大匹配模板(匈牙利算法)

二分图最大匹配模板(匈牙利算法)

时间:2023-12-02 12:57:56浏览次数:46  
标签:二分 匹配 int 算法 vector 模板

二分图最大匹配模板(匈牙利算法)

P3386 【模板】二分图最大匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

struct augment_path {
	vector<vector<int> > g;
	vector<int> pa;  // 匹配
	vector<int> pb;
	vector<int> vis;  // 访问
	int n, m;         // 两个点集中的顶点数量
	int dfn;          // 时间戳记
	int res;          // 匹配数

	augment_path(int _n, int _m) : n(_n), m(_m) {
		assert(0 <= n && 0 <= m);
		pa = vector<int>(n, -1);
		pb = vector<int>(m, -1);
		vis = vector<int>(n);
		g.resize(n);
		res = 0;
		dfn = 0;
	}

	void add(int from, int to) {
		assert(0 <= from && from < n && 0 <= to && to < m);
		g[from].push_back(to);
	}

	bool dfs(int v) {
		vis[v] = dfn;
		for (int u : g[v]) {
			if (pb[u] == -1) {
				pb[u] = v;
				pa[v] = u;
				return true;
			}
		}
		for (int u : g[v]) {
			if (vis[pb[u]] != dfn && dfs(pb[u])) {
				pa[v] = u;
				pb[u] = v;
				return true;
			}
		}
		return false;
	}

	int solve() {
		while (true) {
			dfn++;
			int cnt = 0;
			for (int i = 0; i < n; i++) {
				if (pa[i] == -1 && dfs(i)) {
					cnt++;
				}
			}
			if (cnt == 0) {
				break;
			}
			res += cnt;
		}
		return res;
	}
};

标签:二分,匹配,int,算法,vector,模板
From: https://www.cnblogs.com/Kescholar/p/17871456.html

相关文章

  • 高斯混合模型:GMM和期望最大化算法的理论和代码实现
    高斯混合模型(gmm)是将数据表示为高斯(正态)分布的混合的统计模型。这些模型可用于识别数据集中的组,并捕获数据分布的复杂、多模态结构。gmm可用于各种机器学习应用,包括聚类、密度估计和模式识别。在本文中,将首先探讨混合模型,重点是高斯混合模型及其基本原理。然后将研究如何使......
  • 51k+ Star!动画图解、一键运行的数据结构与算法教程!
    大家好,我是Java陈序员。我们都知道,《数据结构与算法》——是程序员的必修课。无论是使用什么编程语音,亦或者是前后端开发,都需要修好《数据结构与算法》这门课!在各个互联网大产的面试中,对数据结构和算法的考核乐此不疲。往往《数据结构与算法》学得好的,都能拿到高薪!但是《数......
  • 代码随想录算法训练营第三天 | 203.移除链表元素 707.设计链表 206.反转链表
    LeetCode 203.移除链表元素视频链接:LeetCode203思路:根据链表的性质,将目标值对应的节点保存在一个临时节点中,再重新设置cur下一个节点,再将临时节点进行删除classSolution{public:ListNode*removeElements(ListNode*head,intval){//删除头节点......
  • 【POJ 1144】Network 题解(Tarjan算法求无向图的割点)
    一家电话线公司(TLC)正在建立一个新的电话电缆网络。它们连接由1到N的整数编号的几个位置。没有两个地方的数字相同。这些线路是双向的,总是连接在两个地方,在每一个地方,线路都以电话交换机结束。每个地方都有一个电话交换机。从每个地方可以通过其他地方的线路到达,但不需要直接连接,可......
  • 文心一言 VS 讯飞星火 VS chatgpt (147)-- 算法导论12.2 2题
    二、用go语言,写出TREE-MINIMUM和TREE-MAXIMUM的递归版本。灵捷3.5。文心一言:以下是用Go语言编写的树的最大值和最小值的递归版本代码:packagemainimport("fmt")typeTreeNodestruct{ValintLeft*TreeNodeRight*TreeNode}......
  • Tomasulo算法小结
    总结L.D F6,24(R2)L.D F2,12(R3)MUL.D F0,F2,F4SUB.D F8,F6,F2DIV.D F10,F0,F6ADD.D F6,F8,F2以以上的代码为例,当指令MUL.D即将确认时,保留站、load缓冲器以及寄存器状态表中的内容。(1)保留站的内容当指令MUL.D即将确认,即F0即将写入值时,第1、2、4、6条指令周期短,都......
  • 数据结构与算法之单链表-----黑马程序员(26-35)
    1.链表的概念在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素储存上并不连续。 创建链表如图所示和相关代码publicclassdanlianbiao{privateNodehead=null;//头部第一个结点privatestaticclassNode{//后面的每个结点intvalue;Nodene......
  • 深入了解动态规划算法
    引言动态规划(DynamicProgramming,DP)是一种解决问题的算法范式,在许多领域中都有着广泛的应用。它的核心思想是将问题分解为子问题,并存储已解决的子问题的解,以避免重复计算,提高效率。动态规划的核心原理动态规划算法的成功建立在两个基本原理上:最优子结构:一个问题的最优解可以由其子......
  • 软件设计实验 24:模板方法模式
      实验24:模板方法模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解模板方法模式的动机,掌握该模式的结构;2、能够利用模板方法模式解决实际问题。 [实验任务一]:数据库连接对数据库的操作一般包括连接、打开、使用、关闭等步骤,在数据库操作模板类中我......
  • 排序算法值鸡尾酒排序(java)
    一:概述冒泡排序的每一个元素都可以像小气泡一样,根据自身的大小,一点一点地向着数组的一侧移动。算法的每一轮都是从左到右比较元素,进行单向的位置交换的。鸡尾酒排序做了怎样的优化:鸡尾酒排序的元素比较和交换过程是双向的。二:举例子由9个数字组成的无序数列{2,3,4,5,6,7,1,9......