匈牙利算法 && EK(邻接表)

本文介绍了匈牙利算法的邻接表实现,包括如何添加边以及使用邻接表的基本结构。同时提供了代码示例,帮助读者理解添边过程和邻接表的遍历方式。此外,还涉及了EK算法的实现,包括BFS搜索和路径增广,以求解最大匹配问题。

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

/**
    用邻接表添边是图论中基础中的基础,实用价值十分可观
    添边为固定格式,理解的最好办法是画几个点,自己用手
    模拟一下添边的过程,你会感慨万千,成就感不言而喻。。

    链接表 3剑客为:edge[], edgeHead[], ne;

    edge[] 为每条边得结构体,你可以在里面放任何附加东西
    如:边权w, 流量c, 费用cost。 但v, next是最基本得两个
    变量,这决定了链接表的正常工作。。edge[u].v 即表示边 u-v
    edge[u].next 为u 连接的下条边在edge[]中的下标

    edgeHead[u] 表示节点u 在edge[] 中的位置,通过edgeHead[u]和
    edge[u].next 即可遍历连接u 的所有边,具体操作见下代码。

    特级注意:edgeHead[] 和 ne 的初始化
*/

/**
    匈牙利
*/

#include <cstring>

struct {
    int v, next;
}edge[EMax];

int edgeHead[NMax], link[NMax], vis[NMax];
int ne, n; //初始化为1  //n 为匹配点的个数
//初始化edgeHead[]数组为0
void addEdge(int u, int v) {
    edge[ne].v = v;
    edge[ne].next = edgeHead[u];
    edgeHead[u] = ne++;
}

bool dfs(int u) {
    for (int i=edgeHead[u]; i; i=edge[i].next) {
        int v = edge[i].v;
        if (!vis[v]) {
            vis[v] = tr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值