【模板】一般图最大匹配(带花树算法)/洛谷P6113

给定一个 (n) 个点 (m) 条边的无向图,求该图的最大匹配。

二分图最大匹配,一般用匈牙利算法完成,图中只存在偶环。

而一般图不能分为左右两部,存在奇环,如何处理奇环,是带花树算法的关键。

若将偶环缩为一点,则该图可以简化为只有奇环的无向图。

对于奇环内部,两两匹配后必定多出一个点不能匹配,则将该点与环外部的点相匹配即可。

通过类似匈牙利算法的多次增广,可以找到最大匹配。

点数为 (n),边数为 (m) 。

时间复杂度: (O(n^2 m))

#include
using namespace std;
const int N = 1005;
int  n, m, cnt;
int fa[N], vis[N], tag[N], pre[N], match[N];
queue  q;
vector  e;
vector  G[N];

void addEdge(int a, int b, int i)
{
    e.push_back(b);
    e.push_back(a);
    G[a].push_back(i);
    G[b].push_back(i ^ 1);
}
inline int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);}
inline int lca(int x, int y)
{
    ++cnt;
    while (true)
    {
        if (x)
        {
            x = find(x);
            if (tag[x] == cnt) return x;
            tag[x] = cnt;
            x = pre[match[x]];
        }
        swap(x, y);
    }
}
inline void blossom(int x, int y, int p)
{
    while (find(x) != p)
    {
        pre[x] = y; y = match[x];
        vis[y] = 1; q.push(y);
        if (find(x) == x) fa[x] = p;
        if (find(y) == y) fa[y] = p;
        x = pre[y];
    }
}
bool bfs(int s)
{
    for (int i = 1; i

感谢支持!

Original: https://www.cnblogs.com/jjmg/p/13869334.html
Author: Chiron-zy
Title: 【模板】一般图最大匹配(带花树算法)/洛谷P6113

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/583712/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 一通百通

    遇到问题 前两天做项目遇到问题,发现自己基础不扎实,现记录问题如下: src/components/base/MySelect.vue export default { name:…

    数据结构和算法 2023年6月12日
    0103
  • 来自学长的馈赠6 社论

    A. ^_^ 期望线性性,考虑染一个点 (u) 当且仅当其子树内的点都没被染过,于是期望为 (\dfrac1{siz(u)}) . 于是答案就是 (\displaystyle\su…

    数据结构和算法 2023年6月7日
    092
  • CF1400E Clear the Multiset 题解

    考虑一个分治:每次如果要用第一种,一定是给整个区间用,直到没有办法覆盖整个区间,用的次数是 (\min_{i=L}^R a_i) 次,减去它之后分别递归最小值的两边。注意到如果某一…

    数据结构和算法 2023年6月12日
    090
  • 洛谷P1262 间谍网络(tarjan求强连通分量+缩点)

    题目链接:https://www.luogu.com.cn/problem/P1262 思路:首先,我们能够知道,入读为0 的点 如果不能被收买的话,那么此题是无解的。其次,如果图…

    数据结构和算法 2023年6月8日
    0107
  • STL再回顾(非常见知识点)

    注意:pair对于 ==, !=, <,>, <=,>=<!–=,–><!–,–>进行了重载,提供first第一关键字,se…

    数据结构和算法 2023年6月12日
    094
  • 新的开始

    一直想要写博客来记录和分享自己的学习,所以今天是值得纪念的一天。写博客也是督促我学习吧。下周开始会正式开始写 数据结构也会分享有关数据库和Java的相关知识自己是个小菜狗,所以想要…

    数据结构和算法 2023年6月7日
    0103
  • 线段树(SegmentTree)

    对于数组应用于区间染色实现为On,而线段树是O(logn) 什么是线段树:对于一个二叉树,每一个节点存储的是一个线段或是一个区间相应的信息。 查询 更新 #pragma once …

    数据结构和算法 2023年6月8日
    0111
  • 闲话目录

    闲话目录 闲话目录 点击查看目录 闲话目录 2022年 10月 2023 1月 5月 6月 直接在评论里投稿。 Update 2023/01/12:这玩意是年更的(确信 Updat…

    数据结构和算法 2023年6月8日
    097
  • 数据库索引的基石—-B树

    数据结构相对来说比较枯燥, 我尽量用最易懂的话,来把B树讲清楚。学过数据结构的人都接触过一个概念—-二叉树。简单来说,就是每个父节点最多有两个子节点。为了在二叉树上更快…

    数据结构和算法 2023年6月8日
    084
  • 类暗黑破坏神属性系统思路

    序言 暗黑破坏神,流放之路,火炬之光等经典RPG游戏有令人眼花缭乱的角色属性词缀和相应的机制,搭配修改角色属性的装备,技能,Buff等形成很多有趣的流派。此文提供一种类似游戏的角色…

    数据结构和算法 2023年6月8日
    0115
  • 试除法判断约数 和 试除法判断质数

    约数和质数是我们在认识数学问题中经常遇到的两个概念,所以如何判断他们肯定也是我们需要去考虑! 首先我们看一些判断质数: 因为我们可以知道质数的概念指的是这个数只能被1和自身整除,所…

    数据结构和算法 2023年6月7日
    071
  • 二进制状态压缩

    二进制状态压缩 取出整数n在二进制表示下的第k位: (n>>k)&1 取出整数n在二进制下的第0~k-1位 n&((1<<k)-1) &lt…

    数据结构和算法 2023年6月8日
    078
  • 力扣55. 跳跃游戏

    55.跳跃游戏 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1: 输入:nums = [2,3,1,1,4]输出:true解释:可以…

    数据结构和算法 2023年6月16日
    0133
  • 06. 插值算法

    posted @2022-09-01 15:24 JamesNULLiu 阅读(15 ) 评论() 编辑 Original: https://www.cnblogs.com/jam…

    数据结构和算法 2023年6月12日
    0118
  • 量子技术学习笔记

    量子力学 争论焦点:自然界是否确实按量子力学的规律运行? 经典力学:宏观物质的运动规律,确定性 量子力学:微观粒子的运动规律,概率性 自然界的运动规律到底是哪一种?这就是争论点。 …

    数据结构和算法 2023年6月7日
    087
  • 数据结构 3

    「codeforces – 1416D」Graph and Queries:显然倒着做,考虑怎么维护合并连通块。有个 kruskal 重构树的 trick 是,合并连通…

    数据结构和算法 2023年6月12日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球