第8章第5节-我要做月老-二分图最大匹配-匈牙利算法

本文介绍了二分图最大匹配问题,通过匈牙利算法实现求解。详细阐述了算法步骤,包括从任意未配对点开始尝试配对,通过深度优先搜索寻找增广路径,更新配对关系,直至所有点尝试完毕。示例代码展示了如何在C语言中应用该算法,以解决实际配对问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
二分图的定义:如果一个图所有顶点可以被分为X和Y两个集合,并且所有边的两个顶点恰好
一个属于集合X,另一个属于集合Y,即每个集合内顶点没有边相连,那么此图就是二分图
步骤如下:
1.首先从任意一个未被配对的点u开始,从点u的边中任意选一条边(假设这条边是u->v)
开始配对。如果此时v还没有被配对,则配对成功,此时便找到一条增广路(只不过这条增广路
比较简单)。如果此时v已经被配对,那就要尝试进行连锁反应。如果尝试成功了,则找到一条增广路,
此时更新原来的配对关系,这里要用一个数组match来记录配对关系,比如点v与点u配对了,就记做
match[v] = u。配对成功后,记得要将配对数加1.配对的过程我们可以通过深度优先搜索来实现,
当然广度优先搜索也可以。
2.如果刚才所选的边配对失败,要从点u的边中重新选一条边,进行尝试。直到点
u配对成功,或者尝试过点u所有的边为止。
3.接下来继续对剩下没有被配对的点一一进行配对,直到所有的点都尝试完毕,找不到
新的增广路为止。
4.输出配对数
*/


#include "stdio.h"
int e[101][101];
int match[101];
int book[101];
int n,m;
int dfs(int u)
{
    int i;
    for(i = 1;i <=n;i++)
    {
    &n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Realeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值