二分图最大匹配模版 m√(n) 复杂度
周大爷在比赛中搜到的黑科技二分图模版,复杂度为m√(n):
注意:点的序号要从0开始!
需要把nx,ny都赋值为n(点数)
- const int MAXN = ;
- const int MAXM = *;
- struct Edge {
- int v;
- int next;
- } edge[MAXM];
- struct node {
- double x, y;
- double v;
- } a[MAXN], b[MAXN];
- int nx, ny;
- int cnt;
- int t;
- int dis;
- int first[MAXN];
- int xlink[MAXN], ylink[MAXN];
- /*xlink[i]表示左集合顶点所匹配的右集合顶点序号,ylink[i]表示右集合i顶点匹配到的左集合顶点序号。*/
- int dx[MAXN], dy[MAXN];
- /*dx[i]表示左集合i顶点的距离编号,dy[i]表示右集合i顶点的距离编号*/
- int vis[MAXN]; //寻找增广路的标记数组
- void init() {
- cnt = ;
- memset(first, -, sizeof(first));
- memset(xlink, -, sizeof(xlink));
- memset(ylink, -, sizeof(ylink));
- }
- void read_graph(int u, int v) {
- edge[cnt].v = v;
- edge[cnt].next = first[u], first[u] = cnt++;
- }
- int bfs() {
- queue<int> q;
- dis = INF;
- memset(dx, -, sizeof(dx));
- memset(dy, -, sizeof(dy));
- for(int i = ; i < nx; i++) {
- if(xlink[i] == -) {
- q.push(i);
- dx[i] = ;
- }
- }
- while(!q.empty()) {
- int u = q.front();
- q.pop();
- if(dx[u] > dis) break;
- for(int e = first[u]; e != -; e = edge[e].next) {
- int v = edge[e].v;
- if(dy[v] == -) {
- dy[v] = dx[u] + ;
- if(ylink[v] == -) dis = dy[v];
- else {
- dx[ylink[v]] = dy[v]+;
- q.push(ylink[v]);
- }
- }
- }
- }
- return dis != INF;
- }
- int find(int u) {
- for(int e = first[u]; e != -; e = edge[e].next) {
- int v = edge[e].v;
- if(!vis[v] && dy[v] == dx[u]+) {
- vis[v] = ;
- if(ylink[v] != - && dy[v] == dis) continue;
- if(ylink[v] == - || find(ylink[v])) {
- xlink[u] = v, ylink[v] = u;
- return ;
- }
- }
- }
- return ;
- }
- int MaxMatch() {
- int ans = ;
- while(bfs()) {
- memset(vis, , sizeof(vis));
- for(int i = ; i < nx; i++) if(xlink[i] == -) {
- ans += find(i);
- }
- }
- return ans;
- }
- double dist(const node a, const node b) {
- return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
- }
调用:
- init();
- for(int i = ; i < m; i++) {
- if(l[edgee[i][]] && edgee[i][] != s && !l[edgee[i][]]) read_graph(edgee[i][],edgee[i][]);
- if(l[edgee[i][]] && edgee[i][] != s && !l[edgee[i][]]) read_graph(edgee[i][],edgee[i][]);
- }
- nx = n;
- ny = n;
- int ans = MaxMatch();
二分图最大匹配模版 m√(n) 复杂度的更多相关文章
- HDU-1083 Courses 二分图 最大匹配
题目链接:https://cn.vjudge.net/problem/HDU-1083 题意 有一些学生,有一些课程 给出哪些学生可以学哪些课程,每个学生可以选多课,但只能做一个课程的代表 问所有课能 ...
- UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法
二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). ...
- 【网络流#6】POJ 3041 Asteroids 二分图最大匹配 - 《挑战程序设计竞赛》例题
学习网络流中ing...作为初学者练习是不可少的~~~构图方法因为书上很详细了,所以就简单说一说 把光束作为图的顶点,小行星当做连接顶点的边,建图,由于 最小顶点覆盖 等于 二分图最大匹配 ,因此求二 ...
- SPOJ 4206 Fast Maximum Matching (二分图最大匹配 Hopcroft-Carp 算法 模板)
题目大意: 有n1头公牛和n2头母牛,给出公母之间的m对配对关系,求最大匹配数.数据范围: 1 <= n1, n2 <= 50000, m <= 150000 算法讨论: 第一反应 ...
- HDU2389(KB10-F 二分图最大匹配Hopcroft_Karp)
Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K (Java/Ot ...
- HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- POJ 1469 COURSES 二分图最大匹配 二分图
http://poj.org/problem?id=1469 这道题我绝壁写过但是以前没有mark过二分图最大匹配的代码mark一下. 匈牙利 O(mn) #include<cstdio> ...
- UVA1663 Purifying Machine (匈牙利算法,二分图最大匹配)
模版集合个数减少是因为匹配串集合中没被匹配过的一对串匹配了.所以就是找一个二分图最大匹配. 因为集合X和Y是不好分开的,但是可以直接跑,两个集合都会跑一遍,所以一个匹配会被算两次,返回的时候除以2就行 ...
- 二分图最大匹配初探 By cellur925
一.什么是二分图 首先它需要是一张无向图. 之后它需要同时满足两个条件:①它的N个点被分为两个集合,且这两个集合交集为空:②同一集合内的点之间没有边相连. 二.无向图是否为二分图的判定 引理:无向图是 ...
随机推荐
- Centos6.5中如何用sqlite3命令打开’.db’后缀的数据库执行sql
1. 简单sql语句使用: 在任意目录下新建一个数据库,比如student . 命令: sqlite3 student.db 出现如下提示: 输入sql语句create table user(us ...
- 关于Spring配置文件提示的插件下载
1.springsource-tool-suite-update 最新各个版本下载地址 第一种方式: springsource-tool-suite-3.7.3.RELEASE-e4.5.2-upda ...
- jQuery.validate.js表单验证插件
jQuery.validate.js表单验证插件的使用 效果: 代码: <!DOCTYPE html> <html lang="en"> <head& ...
- PHP的strtotime()函数2038年bug问题
最近在开发一个订单查询模块的时候,想当然的写了个2099年的日期,结果PHP返回了空值,肯定是发生溢出错误了,搜索了网上,发现下面这篇文章,但是我的问题依然没有解决,要怎么得到2038年以后的时间戳呢 ...
- [Doctrine Migrations] 数据库迁移组件的深入解析四:集成diff方式迁移组件
场景及优势 熟悉Symfony框架之后,深刻感受到框架集成的ORM组件Doctrine2的强大之处,其中附带的数据迁移也十分方便.Doctrine2是使用Doctrine DBAL组件把代码里面的表结 ...
- 大数据 : Hadoop reduce阶段
Mapreduce中由于sort的存在,MapTask和ReduceTask直接是工作流的架构.而不是数据流的架构.在MapTask尚未结束,其输出结果尚未排序及合并前,ReduceTask是又有数据 ...
- Shellz中awk的简单用法
其实shell脚本的功能常常被低估.在实际应用中awk sed 等用法可以为shell提供更为强大的功能.下面我们将一下awk调用的简单方法进行了总结.方便同学们学习: awk的简单用法: 第一种调用 ...
- linux不重启挂载磁盘安装grub
挂载.分区.grub 通过给一块新磁盘安装grub回顾磁盘挂载.分区文件系统创建等操作: 该实验基于(CtonOS6.8:kernel:2.6.32-642.15.1.el6.x86_64) 1.通过 ...
- Python爬虫系列 - 初探:爬取旅游评论
Python爬虫目前是基于requests包,下面是该包的文档,查一些资料还是比较方便. http://docs.python-requests.org/en/master/ POST发送内容格式 爬 ...
- web前端知识点1
1. input属于窗体元素,层级显示比flash.其它元素都高.请判断这句话的正确与否. 错误 层级显示优先级: frameset > 表单元素 > 非表单元素 在html中,帧元素(f ...