首页 > 编程语言 >【学习笔记】二分图匹配 匈牙利(NTR)算法

【学习笔记】二分图匹配 匈牙利(NTR)算法

时间:2024-02-01 15:36:50浏览次数:34  
标签:二分 右边 匹配 int NTR 算法 const 505

时间复杂度

显然,这个算法的时间复杂度是O(一边的点数*边数)

因为最坏情况就是每一个点都要把所有的边问一遍能不能匹配

显然,常数极小

另外可以留意一下数据范围,因为如果是稠密图(\(n=500 m=2e5\)这种)就可以考虑邻接矩阵存图,方便判重边S

准备

以下是跑Ntr算法要用的一些东西

如果题里没直接给,应该想办法先搞出来

1.左边的点(和右边的点)
2.左边的点指向右边的点的边(反着的边无所喂)
3.vis数组 用于记录每次增广中一个右边的点是否已经被访问(如果已经访问过就没必要再访问了)
4.match数组 用于记录每一个右边点现在匹配的左边点

板子题

luoguP3386

板子

#include<bits/stdc++.h>
using namespace std;

const int N= 505;
const int M= (int)5e4;

int n,m,c;

int g[505][505];

int match[N];
bool vis[N];

int ans;

bool Ntr(int u)
{
    for(int i=1;i<=m;i++)
    {
        if(g[u][i]==1 && !vis[i])
        {
            vis[i]=1;
            if(!match[i] || Ntr(match[i])) 
            {   
                match[i]=u;
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    cin>>n>>m>>c;
    for(int i=1;i<=c;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        g[u][v]=1;
    }
    for(int i=1;i<=n;i++)
    {
        memset(vis,0,sizeof(vis));
        if(Ntr(i)) ans++;
    }
    cout<<ans;
    return 0;
}

标签:二分,右边,匹配,int,NTR,算法,const,505
From: https://www.cnblogs.com/yeyou26/p/18001231

相关文章

  • 【算法】模拟
    模拟模拟就是用代码模拟出题目所要求的操作。虽然本质上比较简单,但是码量大,很难调错。所以做模拟题的时候一定要先构思好再敲代码。例题1:小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从\(1970\)年\(1\)月\(1\)日\(......
  • 代码随想录算法训练营第四天 |24. 两两交换链表中的节点 | 19.删除链表的倒数第N个节
    142.环形链表II 已解答中等 相关标签相关企业 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,......
  • [转帖]Open JDK 8.0_152-b16 崩溃 : [libzip.so+0x12522] newEntry+0x62
    一.问题描述在执行spark任务的时候,JVM崩溃.崩溃dump日志:##AfatalerrorhasbeendetectedbytheJavaRuntimeEnvironment:##SIGBUS(0x7)atpc=0x00007f9adacb9522,pid=107874,tid=0x00007f9add417700##JREversion:Java(TM)SERuntimeEnvironme......
  • R语言社区检测算法可视化网络图:ggplot2绘制igraph对象分析物种相对丰度
    原文链接:http://tecdat.cn/?p=23836原文出处:拓端数据部落公众号我们使用R中的igraph包,产生了网络的图形。但是很难将这些图表放到演讲和文章中,因为图表很难根据需要定制。使用igraph中的绘图功能可以得到你想要的结果,但用ggplot对工作更有帮助。所以本文探索了一种在ggplot中创......
  • 文心一言 VS 讯飞星火 VS chatgpt (191)-- 算法导论14.2 1题
    一、用go语言,通过为结点增加指针的方式,试说明如何在扩张的顺序统计树上,支持每一动态集合查询操作MINIMUM、MAXIMUM、SUCCESSOR和PREDECESSOR在最坏时间O(1)内完成。顺序统计树上的其他操作的渐近性能不应受影响。文心一言:为了在扩张的顺序统计树上支持每一动态集合查询操作......
  • k_means算法
    C语言代码#include<iostream>usingnamespacestd;//定义点的结构体structpoint{doublex;//点的x坐标doubley;//点的y坐标intcentroid;//点所属的质心};//定义计算两点之间距离的函数doubledist(structpointa,structpointb){......
  • 指针扫描型字符串算法
    【最小表示法】最小表示法循环表示:从一个位置开始向后遍历,到末尾再倒回去最前面。一个字符串(数组)一共有\(n\)个。最小表示法就是最小的循环表示。例如,31491的最小表示法是13149.如果我们用打擂台比大小的方式,因为字符串之间比较需要时间,总共是\(O(n^2)\)的,太慢......
  • 字符串算法学习笔记
    \(\text{Pt.}1\)基础一、进制哈希二、Manacher三、Trie\(\text{Pt.}2\)自动机自动机是什么?它是一个对“信息序列”进行判定的数学模型。“信息序列”可以很随意,比如一个二进制数,比如一个字符串。而“判定”也可以很随意,比如判定一个二进制数是不是奇数,判定当前字符串是......
  • 二分查找
    704.二分查找(Easy)问题描述:给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:输......
  • CEIT算法训练-双指针部分题解(T1-3)
    AnagramSearch题意简述两个字符串\(s\)和\(t\)相似的定义为:\(s\)可以打乱之后重新排列成为\(t\)。题目给出\(a\)和\(b\),问\(a\)中有多少子串(连续的一段)与\(b\)相似。同时,\(a\)中还含有\(?\)字符,他可以等价于任何字符(可以变成任何字符)解题思路实际上,根据题......