二分图

如果一张图能被分为两部分,两部分之间存在边相连,而单个部分内的结点无边相连,那这张图叫做二分图

判断二分图

我们给图进行染色,从一个点开始染成红色,相邻点染蓝色,最后能全部染完,并且任意相邻点颜色不同,说明这是一张二分图。

很好证明:假如从一个点出发,对于一个已经染好色的点,再次访问到时发现需要染另一种颜色,则与开始点形成一个奇数环,这样的话从这个点能染一圈染回来,但是颜色却是矛盾的。

匈牙利算法

之前博哥让我讲过的hh,练练题加深一下

匈牙利算法除了二分图多重匹配之外,在二分图匹配中都能使用,还是比较常用的

大致过程

假如把图分成左右两部分,过程就是令依次遍历左边的结点,去连接右边的结点,如果发现所对应的点已经被之前的点所连,那么让之前的点挪一下(当然,不能挪就别挪了),去连接接下来的点,这是一个递归的过程,递归到能连上为止,如果不行,那说明这个点无法与右边的点匹配。

百度内容:匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法

时间复杂度 O(nm)

代码

板子题:P3386 【模板】二分图最大匹配

#include<bits/stdc++.h>
using namespace std;
int edge[1001][1001], flag[1001], to[1001], n, m, e, ans;
bool find(int x){for(int j = 1;j <= m;j ++){if(edge[x][j] && flag[j] == 0){flag[j] = 1;if(to[j] == 0 || find(to[j])){to[j] = x;return 1;}}}return 0;
}
int main(){cin >> n >> m >> e;for(int i = 1;i <= e;i ++){int u, v;cin >> u >> v;edge[u][v] = 1;}for(int i = 1;i <= n;i ++){memset(flag, 0, sizeof(flag));if(find(i))ans++;}cout << ans;return 0;
}

后续找点进阶的题做做。。

有时间浅学一下网络流的板子吧


update:改了改板子,用邻接表的版本

#include<bits/stdc++.h>
using namespace std;
struct node{int u, v, next;
}edge[110000];
int n, m, e, ans, cnt;
int flag[10001], to[10001], head[10001];
void add(int u, int v){edge[++cnt].u = u;edge[cnt].v = v;edge[cnt].next = head[u];head[u] = cnt;
}
inline int find(int x){for(int i = head[x];i;i = edge[i].next){int v = edge[i].v;if(flag[v]) continue;flag[v] = 1;if(to[v] == 0 || find(to[v])){to[v] = x;return 1;}}return 0;
}
int main(){cin >> n >> m >> e;for(int i = 1;i <= e;i ++){int u , v;cin >> u >> v;add(u, v);   }for(int i = 1;i <= n;i ++){memset(flag,0,sizeof(flag));if(find(i))ans++;}cout << ans << endl;return 0;
}

算法补完计划(五) 二分图匹配相关推荐

  1. NLP 开源形近字算法补完计划(完结篇)

    前言 所有的故事都有开始,也终将结束. 本文将作为 NLP 汉字相似度的完结篇,为该系列画上一个句号. 起-NLP 中文形近字相似度计算思路 承-中文形近字相似度算法实现,为汉字 NLP 尽一点绵薄之 ...

  2. 【机器学习】补完计划

    机器学习补完计划 发现之前的帖子太长了,拆了整理一下,理一理以前的笔记,其实代码实现和数学推导更加有助于理解 PS:任天堂特邀嘉宾来举例子 波克基斯.玛狃拉,比卡超 四个主要任务 分类(classif ...

  3. [TaskList] 省选前板子补完计划

    省选前本子补完计划 [ ] 带权并查集 [ ] 树上莫队 - UOJ58 [WC2013]糖果公园 loj2485「CEOI2017」Chase 转载于:https://www.cnblogs.com ...

  4. macos模拟器_苹果芯补完计划,iOS终将回归mac OS?

    在过去几年时间里,国内外有越来越多小道消息都在传苹果将为新款Mac改用定制设计的ARM处理器:<彭博社>曾报道,苹果可能于今年开始在 Mac 电脑上改用内部代号为Kalamata的自研处理 ...

  5. Hrbust 2222 应援团补完计划【并查集+思维】好题~

    应援团补完计划 Time Limit: 3000 MS Memory Limit: 32768 K Total Submit: 9(5 users) Total Accepted: 3(3 users ...

  6. 紫书已经基本学完现在开启紫书题目补完计划!!!

    最迟2个月...把紫书所有的题目都补完从9月28到11月28号.把紫书的题目在本博客补完. 转载于:https://www.cnblogs.com/baccano-acmer/p/9716090.ht ...

  7. dex字符串解密_Androguard补完计划——锁定字符串解密函数

    一.理论基础(我们先讲道理) 上回说到我们找到了dex中的加密字符串 提取加密字符串. 观众老爷们问:那么找到这些加密字符串有什么作用呢?该看不懂的还是看不懂啊... 那么今天我就来告诉大家,找到的这 ...

  8. 【POJ - 2226】Muddy Fields(匈牙利算法 或 网络流dinic,二分图匹配,最小点覆盖,矩阵中优秀的建图方式 )

    题干: Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R <= 5 ...

  9. [笔试补完计划]澜起科技2022数字验证笔试

    澜起科技2022数字验证笔试 时间2021.8.11 简答题(共11题) 1.[简答题]Please provide Linux shell command(s)to find all files w ...

最新文章

  1. 如何找出nginx配置文件的所在位置?
  2. 利用 IHttpHandler 自定义 HTTP 处理程序
  3. 我们为什么要做数据分析?
  4. 轻松实现突破网管限制(SoftEther实际应用)
  5. java11新特性_Java11 发布前抓紧掌握这些新特性
  6. 力扣—— 224. 基本计算器(困难)
  7. 用shell求两个文件的差集
  8. $SVN代码版本管理工具的使用
  9. 区块链 自私挖矿(selfish mining)是什么
  10. 通信模块整理(一)JDY-31
  11. java 跨站脚本攻击_XSS(跨站脚本攻击)漏洞解决方案
  12. 安装一台RHEL7虚拟机
  13. MineCraft - 服务端插件指令汇总
  14. AndroidX全解析
  15. springboot整合bboss操作elasticsearch
  16. 嵌入式系统的功能性指标及非功能性指标
  17. Java练习案例之输入一个字符串统计每个字母出现次数
  18. sql分组 会计分录_oracle\EBS\常用表\视图\会计分录\mtl_serial_numbers\总账
  19. 记一次注销联通卡的吐血经历
  20. 支付宝支付-扫码支付详解

热门文章

  1. 当你敲完Hello World后的第一步——C
  2. 废墟里,我和同学立下约定
  3. 重走长征路---OI每周刷题记录---8月16日 2014
  4. CSS三种样式表:行内样式表、内部样式表、外部样式表
  5. 超级实习生内推的实习offer,实习经历企业认可吗?
  6. 包头事业单位计算机考试试题,内蒙古包头市事业单位考试题库及答案(事业编笔试题库)...
  7. 同位语和插入语的理解
  8. 通过室内LED光打造世界的标志
  9. 英国脱欧后,筒灯BS 476-21耐火报告还有用吗?需要更换成EN 1365-2的报告吗?
  10. 华为手机Android系统优缺点,华为手机与iPhone相比有哪些优缺点?