使用匈牙利算法来解决二分图的最大匹配问题

其实在写这个的代码的时候我是纳闷的,X集合和Y集合的点,能同时用1,或者2来表示吗?

然后我努力说服自己:它已经是二分图了

它就是存了一个 → 而已

好的我被自己说服了

二分图匹配说的就是,每个人有若干种选择,但是每种选择只能容纳一个人,问你最多能配对多少

或者说成选边的时候不能经过同一个点

最大匹配就是最多选择多少条边的问题

匈牙利算法就是,有机会就上,没机会要创造机会也要上,尽可能地给当前腾地方,腾的过程是一个递归的过程

其实这个算法挺矫情的。。

bool find(int u)
{
    for(int tmp=g[u];tmp;tmp=e[tmp].next)
        if(!y[e[tmp].t])
        {
            y[e[tmp].t]=1;
            if(lk[e[tmp].t]==0||find(lk[e[tmp].t]))
            {
                lk[e[tmp].t]=u;
                return 1;
            }
        }
        return 0;
}

建图之后,对于每个X中的点,清空y数组之后find就好了

然后忘了说定义了,补上。。

int n,m,cnt,ans;
int y[maxn],lk[maxn],g[maxn];

y记录的是Y中的下标节点是否被访问过

lk记录的是与当前下标节点(Y中)相连的X中的节点

然后给出完整实现:

 1 #include<cstdio>
 2 #include<cstring>
 3 const int maxn=205;
 4 const int maxm=205;
 5 int n,m,cnt,ans;
 6 int y[maxn],lk[maxn],g[maxn];
 7 struct Edge{int t,next;}e[maxn*maxm];
 8 void addedge(int u,int v)
 9 {
10     e[++cnt].t=v;e[cnt].next=g[u];
11     g[u]=cnt;
12 }
13 bool find(int u)
14 {
15     for(int tmp=g[u];tmp;tmp=e[tmp].next)
16         if(!y[e[tmp].t])
17         {
18             y[e[tmp].t]=1;
19             if(lk[e[tmp].t]==0||find(lk[e[tmp].t]))
20             {
21                 lk[e[tmp].t]=u;
22                 return 1;
23             }
24         }
25         return 0;
26 }
27 int main()
28 {
29     scanf("%d%d",&n,&m);
30     int tmp,tmp1;
31     for(int i=1;i<=n;i++)
32     {
33         scanf("%d",&tmp);
34         for(int j=1;j<=tmp;j++)
35         {
36             scanf("%d",&tmp1);
37             addedge(i,tmp1);
38         }
39     }
40     for(int i=1;i<=n;i++)
41     {
42         memset(y,0,sizeof(y));
43         if(find(i)) ans++;
44     }
45     printf("%d",ans);
46     return 0;
47 }

老实说,这个算法,真的很神奇。。

原文地址:https://www.cnblogs.com/aininot260/p/9434172.html

时间: 2024-10-05 08:29:57

使用匈牙利算法来解决二分图的最大匹配问题的相关文章

匈牙利算法dfs模板 [二分图][二分图最大匹配]

最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs 于是用到了dfs模板 寻找二分图最大匹配的算法是匈牙利算法 匈牙利算法的主要程序是寻找增广路 寻找增光路是过程是:从一个未经配对的点出发,历经未配边.匹配边.未配边.匹配边.未配边....最终到达一个未配点的过程,只要把路径中的未配边和匹配边的“身份”对调,匹配就加一了.这就是一个寻找增广路的过程,通过不断寻找增广路,可以找到最大的匹配. 1 #include<cstdio> 2 #include<cstring&g

Hungarian method (匈牙利算法)----解决指派问题(转)

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

匈牙利算法 二分图最大匹配题模板

[任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y之前没有被匹配,那么(x,y)就是一对合法的匹配,我们将匹配数加一, 否则我们试图给原来匹配的y和x'重新找一个匹配,如果x'匹配成功,那么(x,y)就可以新增为一对合法的匹配. 给x'寻找匹配的过程可以递归解决. [接口] int hungary(); 复杂度O(|E|*sqrt(|V|)) 输入

二分图的最大匹配 (匈牙利算法)再续

标签:二分图 最大匹配 最小集覆盖 匈牙利算法 1.二分图.最大匹配 什么是二分图:二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 什么是匹配:把上图想象成3男4女搞对象(无同性恋),连线代表彼此有好感,但最终只能1夫1妻,最终的配对结果连线就是一个匹配.匹配可以是空. 什么是最大匹配:在有好

FOJ 2232 匈牙利算法找二分图最大匹配

题目链接 简单理解匈牙利算法 简单理解二分图 尽量让每一个随从击败一个对手且随从全部存活,关键是为每一个随从找对手(递归过程),"腾". #include<iostream> #include<cstdio> #include<cstring> using namespace std; int used[110]; int g[110][110]; //建立随从和对手的对战关系 int ee[110]; int n; struct people{ i

图论2——二分图与匈牙利算法

一般情况下,我们用的都是简单图.带权图,无向图:还有各种算法,像Floyd,SPFA,Dijkstra-- 但是,在我们需要进行一些匹配问题的时候,我们就不能够只是用简单图了,不然最终可能会收获TLE(超时). 这个时候,我们就要让二分图出场了! 1.二分图的应用 我们举一个最简单的例子.有N名男运动员和M名女运动员要组成尽可能的多的混双配对,其中有一些不能够配对,请问如何处理? 这时候,大家就可能比较头疼--没有什么思路.各种数据结构似乎也都无能为力,组合数论看起来可以,实际上也算不出来,更不

求无权图的最大匹配---匈牙利算法

匈牙利算法 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名,,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. [先介绍几个概念] 匹配:在图论中,一个「匹配」(matching)是一个边的集合,其中任意两条边都没有公共顶点.例如,图3.图4 中红色的边就是图 2 的匹配. 我们定义匹配点.匹配边.未匹配点.非匹配边,它们的含义非常显然.例如图 3中 1.4.5.7为匹配点,其他顶点为未匹配点:1-5.4-7为匹配边,其他边为

矩阵游戏|ZJOI2007|BZOJ1059|codevs1433|luoguP1129|二分图匹配|匈牙利算法|Elena

1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个N *N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换操作:选择 矩阵的任意两行,交换这两行(即交换对应格子的颜色)列交换操作:选择矩阵的任意行列,交换这两列(即交换 对应格子的颜色)游戏的目标,即通过若干次操作,

POJ 3041 Asteroids (匈牙利算法)

Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14388 Accepted: 7828 Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K astero