基本概念:二分图有两种节点:X节点和Y节点。如果X和Y可以匹配, 则X与Y连着一条边。每个X节点最多只能匹配一个Y节点,同时每个Y节点最多只能匹配一个X节点。最大匹配便是最多的匹配数。

交错路径:交错路径中的边分为重边和轻边。每个每两个相邻的边的种类是不同的。对于两端的边都为轻边的一条交错路径,此时如果把轻边变成重边,重边变成轻边(以后此操作简称翻转),路径上重边的数量便会多一个。

在二分图最大匹配中,一个X一个X地,看看以下通过Dfs实现的操作能否成功:把当前X节点当作起点,图中已经匹配的边为潜在的重边,去寻找一个未匹配过的Y节点。如果操作成功,将找到的交错路径一翻转,匹配的数量就多了一个。最后输出总匹配的数量即可。

注意:Dfs的Vis标记在Y里,而不在X里。

#include <cstdio>
#include <cstring>
using namespace std; const int MAX_XNODE = 1010, MAX_YNODE = 1010, MAX_EDGE = MAX_XNODE*MAX_YNODE;
#define LOOP(i, n) for(int i=1; i<=n; i++) struct Hungary
{
private:
struct Xnode;
struct Ynode;
struct Edge; struct Xnode
{
Edge *Head;
}_xNodes[MAX_XNODE];
int _xCnt; struct Ynode
{
Xnode *Match;
bool Vis;
}_yNodes[MAX_YNODE];
int _yCnt; struct Edge
{
Xnode *X;
Ynode *Y;
Edge *Next;
}*_edges[MAX_EDGE];
int _eCnt; Edge *NewEdge()
{
return _edges[++_eCnt] = new Edge();
} bool Dfs(Xnode *x)
{
for (Edge *e = x->Head; e; e = e->Next)
{
if (!e->Y->Vis)
{
e->Y->Vis = true;
if (!e->Y->Match || Dfs(e->Y->Match))
{
e->Y->Match = x;
return true;
}
}
}
return false;
} public:
Hungary(){} Hungary(int xCnt, int yCnt) :_xCnt(xCnt), _yCnt(yCnt), _eCnt(0)
{
memset(_xNodes, 0, sizeof(_xNodes));
memset(_yNodes, 0, sizeof(_yNodes));
memset(_edges, 0, sizeof(_edges));
} void AddEdge(int xId, int yId)
{
Xnode *x = _xNodes + xId;
Ynode *y = _yNodes + yId;
Edge *e = NewEdge();
e->X = x;
e->Y = y;
e->Next = x->Head;
x->Head = e;
} int GetMatchCnt()
{
int ans = 0;
LOOP(xId, _xCnt)
{
LOOP(yId, _yCnt)
_yNodes[yId].Vis = false;
ans += Dfs(_xNodes + xId);
}
return ans;
}
}; int main()
{
#ifdef _DEBUG
freopen("c:\\noi\\source\\input.txt", "r", stdin);
#endif
int totX, totY, totE, xId, yId;
scanf("%d%d%d", &totX, &totY, &totE);
static Hungary g(totX, totY);
while (totE--)
{
scanf("%d%d", &xId, &yId);
if (xId > totX || yId > totY)
continue;
g.AddEdge(xId, yId);
}
printf("%d\n", g.GetMatchCnt());
return 0;
}

  

luogu3386 【模板】 二分图匹配的更多相关文章

  1. [洛谷P3386] [模板] 二分图匹配 (匈牙利算法)

    题目传送门 毒瘤出题人zzk出了个二分图匹配的题(18.10.04模拟赛T2),逼我来学二分图匹配. 网络流什么的llx讲完之后有点懵,还是匈牙利比较好理解(绿与被绿). 对于左边的点一个一个匹配,记 ...

  2. 模板——二分图匹配KM

    具体方法就不介绍了,详见 https://blog.csdn.net/sixdaycoder/article/details/47720471 主要讲一些注意点: 1:不直接将未匹配的y减小是因为要保 ...

  3. 【洛谷 p3386】模板-二分图匹配(图论)

    题目:给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数. 解法:匈牙利算法.(以前我总是不记得......)实质上应该有贪心的思想,每次都尽量匹配,找到能和自己匹配的也尽量让它们匹配 ...

  4. P3386 【模板】二分图匹配

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

  5. P3386 【模板】二分图匹配(匈牙利&最大流)

    P3386 [模板]二分图匹配 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正 ...

  6. AC日记——【模板】二分图匹配 洛谷 P3386

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

  7. 洛谷—— P3386 【模板】二分图匹配

    P3386 [模板]二分图匹配(复习) 题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每 ...

  8. 牛客多校第五场 E room 二分图匹配 KM算法模板

    链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...

  9. luogu P3386 【模板】二分图匹配

    二次联通门 : luogu P3386 [模板]二分图匹配 /* luogu P3386 [模板]二分图匹配 最大流 设置源点,汇点,连到每条边上 跑一边最大流即可 */ #include <i ...

  10. 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)

    题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...

随机推荐

  1. C - Stones on the Table

    Problem description There are n stones on the table in a row, each of them can be red, green or blue ...

  2. Kali linux 2016.2(Rolling)之 Nessus安装及Plugins Download Fail 解决方法

    最近,因科研需要,学习Nessus. Nessus是一款优秀的漏洞扫描软件,在其v6 HOME版本中在线更新漏洞插件不成功,采用离线更新,成功地更新了插件,在此将更新方法进行分享. 1.Nessus软 ...

  3. jar 包中文乱码注释显示问题解决方案

    通过maven下载源代码,直接通过eclipse浏览源代码时,发现中文注释为乱码的问题.其实这个eclipse默认编码造成的问题.可以通过以下方法解决: 修改Eclipse中文本文件的默认编码:win ...

  4. lnmp 安装FTP服务 并配置FTP用户

    lnmp 默认是不带FTP服务的,需要的童鞋要自行安装.步骤也很简单 一,进入lnmp目录,找到pureftpd.sh 二,直接运行该脚本 ./pureftpd.sh 按任意键开始安装,等待,安装成功 ...

  5. # --with-http_sub_module模块

    作用: http内容替换 语法 第一种语法: sub_filter string:要替换的内容 替换后的内容 这个模块只能替换第一个匹配的字符串,如果需要匹配全部替换,则用到下面的第三种语法配置 第二 ...

  6. 三维重建面试0:*SLAM滤波方法的串联综述

    知乎上的提问,高翔作了回答:能否简单并且易懂地介绍一下多个基于滤波方法的SLAM算法原理? 写的比较通顺,抄之.如有异议,请拜访原文.如有侵权,请联系删除. 我怎么会写得那么长--如果您有兴趣可以和我 ...

  7. OpenCV:OpenCV目标检测Hog+SWindow源代码分析

    参考文章:OpenCV中的HOG+SVM物体分类 此文主要描述出HOG分类的调用堆栈. 使用OpenCV作图像检测, 使用HOG检测过程,其中一部分源代码如下: 1.HOG 检测底层栈的检测计算代码: ...

  8. 使用Reporting Services时遇到的小问题

    同事忙不开了交过来的一个小问题,以前我也没有做过Reporting Services相关的. 大概看了一下,是数据集那边的查询代码接收不到报表参数,而且不是单纯地接收不到,具体情况如下.. 命令类型是 ...

  9. Django_文件上传

    使用Django框架实现文件上传功能    upload.html <!DOCTYPE html> <html lang="en"> <head> ...

  10. Unity与Android通信的中间件

    2.1.1 Fragment和Activity都需要实现的接口——IBaseView/** * Description:Basic interface of all {@link Activity} ...