匈牙利算法

简介

匈牙利算法是一种求二分图最大匹配的算法.

时间复杂度: 邻接表/前向星: \(O(n * m)\), 邻接矩阵: \(O(n^3)\).

空间复杂度: 邻接表/前向星: \(O(n + m)\), 邻接矩阵: \(O(n^2)\).

它的主要思路就是对每个点寻找增广路, 尝试改变之前的选择, 判断是否可行.

事实上, 利用dinic/isap跑二分图有 \(O(n * \sqrt{m})\) 的优秀复杂度(不会证), 因此匈牙利算法仅用于少数特殊情况↓

代码

int to[nsz][nsz]; //邻接表
int vi[nsz],mat[nsz];
bool arg(int p){
rep(i,1,to[0]){
int v=to[p][i];
if(vi[v])continue;
vi[v]=1;
if(mat[v]==0||arg(mat[v])){
mat[v]=p,mat[p]=v;
return 1;
}
}
return 0;
} int hung(){
int res=0;
repdo(i,1,n){
memset(vi,0,sizeof(vi));
res+=arg(i);
}
return res;
}

二分图最小字典序匹配

简介

这就是上面说的特殊情况:P

考虑匈牙利算法的过程: 将每一个点尝试增广, 同时改变之前的点的匹配.

因此, 我们可以考虑将所有点的出边按标号排序, 逆向遍历每一个点, 并按标号顺序尝试增广.

显然, 第一个点的匹配一定是它能匹配到的最小标号, 第二个点的匹配是满足第一个点时的最小标号, 以此类推.

代码

//[NOI2009] 变换序列
int to[nsz][3];
int vi[nsz],mat[nsz];
bool arg(int p){
rep(i,0,1){
int v=to[p][i];
if(vi[v])continue;
vi[v]=1;
if(mat[v]==0||arg(mat[v])){
mat[v]=p,mat[p]=v;
return 1;
}
}
return 0;
} int hung(){
int res=0;
repdo(i,n-1,0){
memset(vi,0,sizeof(vi));
res+=arg(i);
}
return res;
}

参考资料

[模板] 匈牙利算法&&二分图最小字典序匹配的更多相关文章

  1. bzoj3168 钙铁锌硒维生素 (矩阵求逆+二分图最小字典序匹配)

    设第一套为A,第二套为B 先对于每个B[i]判断他能否替代A[j],即B[i]与其他的A线性无关 设$B[i]=\sum\limits_{k}{c[k]*A[k]}$,那么只要看c[j]是否等于零即可 ...

  2. # 匈牙利算法(二分图最大匹配)- hdu 过山车

    匈牙利算法(二分图最大匹配)- hdu 过山车 Hdu 2063 二分图:图中的点可以分成两组U,V,所有边都是连接U,V中的顶点.等价定义是:含奇数条边的图. 匹配:一个匹配是一个边的集合,其中任意 ...

  3. 【POJ 2195】 Going Home(KM算法求最小权匹配)

    [POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  4. Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配

    题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆   输入文件:transform.in   输出文 ...

  5. HDU 1533:Going Home(KM算法求二分图最小权匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=1533 Going Home Problem Description   On a grid map there ...

  6. ACM/ICPC 之 机器调度-匈牙利算法解最小点覆盖集(DFS)(POJ1325)

    //匈牙利算法-DFS //求最小点覆盖集 == 求最大匹配 //Time:0Ms Memory:208K #include<iostream> #include<cstring&g ...

  7. HDU - 1150 POJ - 1325 Machine Schedule 匈牙利算法(最小点覆盖)

    Machine Schedule As we all know, machine scheduling is a very classical problem in computer science ...

  8. [ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)

    描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们 ...

  9. poj1274 匈牙利算法 二分图最大匹配

    poj1274 题意: 有n个奶牛, m个畜舍, 每个畜舍最多装1头牛,每只奶牛只有在自己喜欢的畜舍里才能产奶. 求最大产奶量. 分析: 其实题意很明显, 二分图的最大匹配, 匈牙利算法. #incl ...

随机推荐

  1. sublime实现一键代码格式化

    效果预览 实现 首先下载插件SublimeAstyleFormatter 方法:ctrl + shift + P后输入install Package. 等待一段时间后输入SublimeAstyleFo ...

  2. Broadcast发送广播

    一.知识介绍 1.[广播分类] ①有序广播:接收者A收到广播传递给B,B传给C,有序传递.任何一个环节都可以终止广播,也可以修改广播中携带的数据. 发送的方式:sendOrderedBroadcast ...

  3. Android 获取 上下文环境参数 getResources

    1----context.getResources().getConfiguration().orientation;//获取屏幕方向int类型,1:portrait,2:landscape 2--- ...

  4. MAC MAMP 中安装配置使用 ThinkPHP

    MAMP PRO 是Mac OS X 平台上经典的本地环境应用 MAMP 的专业版.专门为专业的Web开发人员和程序员轻松地安装和管理自己的开发环境. MAMP这几个首字母代表Mac OS X系统上的 ...

  5. 【原】Java学习笔记015 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 传递 值类型参数 ...

  6. oracle EM 如何调整界面显示的语言

    EM是通过浏览器语言来识别界面语言的,没有选项调整.我以chrome为例将默认中文改为英文: EM调整前为中文界面: 调整chrome语言显示为英文: 再重新开一个窗口,打开EM,界面已经调整为英文了 ...

  7. Windows 下安装drozer(Windows 10),连接手机(红米note4X)

    Windows 下安装drozer(Windows 10),连接手机(红米note4X) 首先下载drozer(http://mwr.to/drozer). 红米手机开发者模式 遇到第一个问题,红米手 ...

  8. PHAR系列之导言

    由于之前都是在现成的PHP框架下写web项目,一般都只专注于框架内部的使用跟优化.但是对于一些PHP很有特色的功能跟特性很少过多的深入了解.最近做项目调研的时候偶尔注意到一个PHP中一个比较常见的概念 ...

  9. Python开发【socket篇】解决粘包

    客户端 import os import json import struct import socket sk = socket.socket() sk.connect(('127.0.0.1',8 ...

  10. Python开发【前端篇】CSS

    1.css基本语法及页面引用 css基本语法 css的定义方法是: 选择器 { 属性:值; 属性:值; 属性:值;} 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性每个属性有一个或多 ...