二部图的最大匹配问题代码详解

本文深入探讨了二部图在复杂网络分析中的应用,并详细讲解了实现最大匹配的三种算法:BFS、DFS及Hopcroft-Karp算法。通过学习,读者可以更好地理解和应用这些算法。

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

在复杂网络中,二部图是被经常使用到的一种分析问题的方法,本文将笔者最近学习的二部图知识汇总整理一下,以供交流学习。

二部图的最大匹配有三种基本的算法:1)BFS;2)DFS;3)Hopcroft-Karp算法 

1)BFS;2)DFS;

#include <iostream>
#include <fstream>
#include<string>
#define MAXN 10000
using namespace std;


int mk[MAXN];                          //mk[i]=0表示未访问过,为1表示访问过
int nx=MAXN, ny=MAXN;                  //X,Y集合中顶点的个数
int g[MAXN][MAXN];                     //邻接矩阵,g[i][j]为1,表示Xi,Yj有边相连
int cx[MAXN],cy[MAXN];                 //cx[i]最终求得的最大匹配中与Xi匹配的Y顶点,cy[i]同理
int pred[MAXN];                        //用来记录交错轨的,同时也用来记录Y集合中的顶点是否被遍历过
int queue[MAXN];                       //实现BFS搜索时,用到的队列(用数组模拟)


int read()                             //读取数据,数组存储
{
    ifstream cin("ER_data.txt",ios::in);
//ifstream cin("test.txt",ios::in);
    for(int i=0;i<MAXN;i++)
        for(int j=0;j<MAXN;j++)
            g[i][j]=0;
    int x,y;
    while(cin>>x>>y)
        g[x][y]=1;
    cin.close();
    return 0;
}


int path (int u)
{
    for (int v=0; v <ny; v++ )  //考虑所有Yi顶点v
    {
        if (g[u][v]&&!mk[v])     //v与u邻接,且没有访问过
        {
            mk[v]=1;             //访问v
            //如果v没有匹配;或者v已经匹配了,但从cy[v]出发可以找到一条增广路
            //注意,前一个条件成立,则不会递归调用
            if (cy[v]==-1||path ( cy[v]) )
            {
                cx[u]=v;
                cy[v]=u;
                retu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值