二分图匹配——定义,经典模型以及简单的匈牙利算法

来源:互联网 发布:淘宝网衣服女装 编辑:程序博客网 时间:2024/06/11 21:17

二分图的定义:

二分图是这样的一个图,它的顶点可以分为两个集合X和Y。所有的边关联的两个顶点中,恰好一个属于集合X,一个属于集合Y。

二分图的匹配:

给定一个二分图G,M为G边集的一个子集,如果M满足当中的任意两条边都不依附于同一个顶点,则称M是一个匹配。

经典模型:

USACO题库:4.2.2 The Perfect Stall完美的牛栏

意思有n头奶牛,m个牛栏,每个牛栏只能供一头牛休息,牛们只会在自己喜爱的牛栏里休息,问你最多有几头牛能够休息。

明显这是一个二分图,要我们求最大匹配数。

匈牙利算法

匈牙利算法就是每次都暴力增广,最坏情况是O(n^3),但是相比最大流实现优点是复杂度较低。

#include<cstdio>#define fo(i,x,y) for(int i=x;i<=y;i++)using namespace std;const int maxn=205;int n,m,x,y,t,ans,bz[maxn],d[maxn],a[maxn][maxn];bool find(int x){    fo(i,1,a[x][0]){        int y=a[x][i];        if(bz[y]!=t){            bz[y]=t;            if(!d[y] || find(d[y])){                d[y]=x;                return 1;            }        }    }    return 0;}int main(){    scanf("%d %d",&n,&m);     fo(i,1,n){        scanf("%d",&a[i][0]);        fo(j,1,a[i][0])            scanf("%d",&a[i][j]);    }    fo(i,1,n)        t=i, ans+=find(i);    printf("%d",ans);}
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 https://www.cocoacontrols.com 风之教堂 黄色网站 AV网站 439973416 فیلترشکن WS_CLIPCHILDREN设置键在哪里 数据结构(严蔚敏李冬梅)课后答案 ipz809 一个字包含的二进制位数 linux面试 【题目2】设计一个结构体类型,包含姓名、出生日期。其中出生日期又包含年、月、日三部分信息。输入n个好 【题目2】设计一个结构体类型,包含姓名、出生日期。其中出生日期又包含年、月、日三部分信息。输入n个好 结构体比较好友中年纪最小的 matlab三维矩阵可视化 使QQ崩溃 scanIP 按照规定,在高速公路上行使的机动车,达到或超出本车道限速的10%则处200元罚款;若达到或超出50% c语言输入三个数字 c语言如何输入三个数求平均值 c语言如何输入三个数求和 C语言为什么只录入了第一个数字 输入多个数字 c语言scanf只有第一个数字 scanf三个整数 double double类型 www和http 会计 日记账 myamnatfound IntroductiontoIoT IntroductiontoIoT 使用哪种类型的无线网络连接城市中的设备来创建城域网 傲世九重天绿帽版 节日 第一章《Java》的思维导图 《Java》的思维导图 python登录大华摄像机 2019普通高等学校招生全国统一考试诊断卷a 考前诊断卷