算法补完计划(五) 二分图匹配
二分图
如果一张图能被分为两部分,两部分之间存在边相连,而单个部分内的结点无边相连,那这张图叫做二分图
判断二分图
我们给图进行染色,从一个点开始染成红色,相邻点染蓝色,最后能全部染完,并且任意相邻点颜色不同,说明这是一张二分图。
很好证明:假如从一个点出发,对于一个已经染好色的点,再次访问到时发现需要染另一种颜色,则与开始点形成一个奇数环,这样的话从这个点能染一圈染回来,但是颜色却是矛盾的。
匈牙利算法
之前博哥让我讲过的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;
}
算法补完计划(五) 二分图匹配相关推荐
- NLP 开源形近字算法补完计划(完结篇)
前言 所有的故事都有开始,也终将结束. 本文将作为 NLP 汉字相似度的完结篇,为该系列画上一个句号. 起-NLP 中文形近字相似度计算思路 承-中文形近字相似度算法实现,为汉字 NLP 尽一点绵薄之 ...
- 【机器学习】补完计划
机器学习补完计划 发现之前的帖子太长了,拆了整理一下,理一理以前的笔记,其实代码实现和数学推导更加有助于理解 PS:任天堂特邀嘉宾来举例子 波克基斯.玛狃拉,比卡超 四个主要任务 分类(classif ...
- [TaskList] 省选前板子补完计划
省选前本子补完计划 [ ] 带权并查集 [ ] 树上莫队 - UOJ58 [WC2013]糖果公园 loj2485「CEOI2017」Chase 转载于:https://www.cnblogs.com ...
- macos模拟器_苹果芯补完计划,iOS终将回归mac OS?
在过去几年时间里,国内外有越来越多小道消息都在传苹果将为新款Mac改用定制设计的ARM处理器:<彭博社>曾报道,苹果可能于今年开始在 Mac 电脑上改用内部代号为Kalamata的自研处理 ...
- Hrbust 2222 应援团补完计划【并查集+思维】好题~
应援团补完计划 Time Limit: 3000 MS Memory Limit: 32768 K Total Submit: 9(5 users) Total Accepted: 3(3 users ...
- 紫书已经基本学完现在开启紫书题目补完计划!!!
最迟2个月...把紫书所有的题目都补完从9月28到11月28号.把紫书的题目在本博客补完. 转载于:https://www.cnblogs.com/baccano-acmer/p/9716090.ht ...
- dex字符串解密_Androguard补完计划——锁定字符串解密函数
一.理论基础(我们先讲道理) 上回说到我们找到了dex中的加密字符串 提取加密字符串. 观众老爷们问:那么找到这些加密字符串有什么作用呢?该看不懂的还是看不懂啊... 那么今天我就来告诉大家,找到的这 ...
- 【POJ - 2226】Muddy Fields(匈牙利算法 或 网络流dinic,二分图匹配,最小点覆盖,矩阵中优秀的建图方式 )
题干: Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R <= 5 ...
- [笔试补完计划]澜起科技2022数字验证笔试
澜起科技2022数字验证笔试 时间2021.8.11 简答题(共11题) 1.[简答题]Please provide Linux shell command(s)to find all files w ...
最新文章
- 如何找出nginx配置文件的所在位置?
- 利用 IHttpHandler 自定义 HTTP 处理程序
- 我们为什么要做数据分析?
- 轻松实现突破网管限制(SoftEther实际应用)
- java11新特性_Java11 发布前抓紧掌握这些新特性
- 力扣—— 224. 基本计算器(困难)
- 用shell求两个文件的差集
- $SVN代码版本管理工具的使用
- 区块链 自私挖矿(selfish mining)是什么
- 通信模块整理(一)JDY-31
- java 跨站脚本攻击_XSS(跨站脚本攻击)漏洞解决方案
- 安装一台RHEL7虚拟机
- MineCraft - 服务端插件指令汇总
- AndroidX全解析
- springboot整合bboss操作elasticsearch
- 嵌入式系统的功能性指标及非功能性指标
- Java练习案例之输入一个字符串统计每个字母出现次数
- sql分组 会计分录_oracle\EBS\常用表\视图\会计分录\mtl_serial_numbers\总账
- 记一次注销联通卡的吐血经历
- 支付宝支付-扫码支付详解
热门文章
- 当你敲完Hello World后的第一步——C
- 废墟里,我和同学立下约定
- 重走长征路---OI每周刷题记录---8月16日 2014
- CSS三种样式表:行内样式表、内部样式表、外部样式表
- 超级实习生内推的实习offer,实习经历企业认可吗?
- 包头事业单位计算机考试试题,内蒙古包头市事业单位考试题库及答案(事业编笔试题库)...
- 同位语和插入语的理解
- 通过室内LED光打造世界的标志
- 英国脱欧后,筒灯BS 476-21耐火报告还有用吗?需要更换成EN 1365-2的报告吗?
- 华为手机Android系统优缺点,华为手机与iPhone相比有哪些优缺点?