【PTA数据结构 | C语言版】求解二部图最大匹配的匈牙利算法

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

题目

请编写程序,实现求解无权二部图最大匹配的匈牙利算法。

输入格式:

输入首先在第一行给出 3 个正整数,依次为二部图 G=(U∪V,E) 中 U 点集顶点数、V 点集顶点数(均不超过 100)和边数 m。

随后 m 行,每行给出一条连接 U 点集顶点和 V 点集顶点的边,格式为 u v,其中 u 属于 U,v 属于 V。两个点集的顶点编号均从 0 开始。同行数字间以一个空格分隔。

输出格式:

在一行中输出 最大匹配值 = x,其中 x 为最大匹配数。

输入样例:

4 3 7

0 0

0 1

1 1

1 2

2 0

2 1

3 2

输出样例:

最大匹配值 = 3

代码

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_U 100
#define MAX_V 100

int graph[MAX_U][MAX_V];    // 二部图的邻接矩阵表示
int matchV[MAX_V];          // 记录V中顶点的匹配情况
int visited[MAX_V];         // 记录V中顶点是否在本次DFS中被访问过
int u_size, v_size, m;      // U和V的顶点数,边数

// 为U中顶点u寻找增广路径
int dfs(int u) {
    for (int v = 0; v < v_size; v++) {
        if (graph[u][v] && !visited[v]) {
            visited[v] = 1;
            // 如果v未匹配,或者v的匹配对象可以找到新的匹配
            if (matchV[v] == -1 || dfs(matchV[v])) {
                matchV[v] = u;
                return 1;
            }
        }
    }
    return 0;
}

int hungarian() {
    int result = 0;
    memset(matchV, -1, sizeof(matchV));  // 初始化V中顶点均未匹配
    
    for (int u = 0; u < u_size; u++) {
        memset(visited, 0, sizeof(visited));  // 每次DFS前重置访问标记
        if (dfs(u)) {
            result++;  // 找到一条增广路径,匹配数加1
        }
    }
    return result;
}

int main() {
    // 读取输入
    scanf("%d %d %d", &u_size, &v_size, &m);
    
    // 初始化图
    memset(graph, 0, sizeof(graph));
    
    // 读取边信息
    for (int i = 0; i < m; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        graph[u][v] = 1;  // 存在边(u,v)
    }
    
    // 计算最大匹配
    int max_matching = hungarian();
    
    // 输出结果
    printf("最大匹配值 = %d\n", max_matching);
    
    return 0;
}
相关推荐
老四啊laosi6 分钟前
[双指针] 3. 力扣--快乐数
算法·leetcode·快慢指针
rit84324996 分钟前
利用随机有限集(RFS)理论结合ILQR和MPC控制蜂群的MATLAB实现
算法·matlab
会编程的土豆10 分钟前
leetcode hot 100 之哈希
算法·leetcode·哈希算法
秋天的一阵风11 分钟前
【LeetCode 刷题系列|第 3 篇】详解大数相加:从模拟竖式到简洁写法的优化之路🔢
前端·算法·面试
qwehjk200815 分钟前
分布式计算C++库
开发语言·c++·算法
m0_7167652315 分钟前
C++提高编程--仿函数、常用遍历算法(for_each、transform)详解
java·开发语言·c++·经验分享·算法·青少年编程·visual studio
寻寻觅觅☆21 分钟前
东华OJ-基础题-59-倒数数列(C++)
开发语言·c++·算法
我不是懒洋洋22 分钟前
【数据结构】顺序表专题(详细代码及配图)
c语言·开发语言·数据结构·算法·青少年编程·visual studio
Trouvaille ~25 分钟前
【优选算法篇】BFS 解决最短路——寻找最优路径的真谛
c++·算法·leetcode·面试·蓝桥杯·宽度优先·最短路问题
雅俗共赏10030 分钟前
医学图像重建中常用的迭代求解器分类
图像处理·算法