AcWing 861. 二分图的最大匹配

2023-11-10

https://www.acwing.com/problem/content/863/

在这里插入图片描述

在这里插入图片描述
二分图我不太清楚,我刚做了染色法解决二分图,然后我看了相关资料。

https://blog.csdn.net/u011815404/article/details/84260940?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161372903816780271563207%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161372903816780271563207&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-84260940.pc_search_result_no_baidu_js&utm_term=%E4%BA%8C%E5%88%86%E5%9B%BE

左右两个部分,中间有m条线,问最多有多少条匹配边。
听y总讲课,我看到有人把这个叫恋爱算法,那我们也把这个叫做恋爱算法吧,哈哈哈。
匈牙利算法的前身确实有点像恋爱算法。
我还找了相关的匈牙利算法资料。(麻利的,相当不错)

https://blog.csdn.net/sunny_hun/article/details/80627351

这个篇博文中主要提到了一个字“腾”,想办法把你喜欢的遇到的前任试图给别的女生去,然后你去追她。
这样一想,其实思路就很简单了,想办法把你想得到的,把潜在的情敌赶走。

代码如下。

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=1e3+10,M=2e5+10;

int h[N],ne[M],e[M],idx;
int n1,n2,m;
int match[N];
bool st[N];

void add(int a,int b)
{
    e[idx]=b;ne[idx]=h[a];h[a]=idx++;//保存你的爱慕的人
}

bool find (int x)//找到可以匹配的对象
{
    for(int i=h[x];i!=-1;i=ne[i])
    {
        int j=e[i];
        if(!st[j])//那个人还没有被拥有
        {
            st[j]=true;
            if(match[j]==0||find(match[j]))//match[j]==0表示还没有对象,find(match[j]是指想办法把情敌
            //赶走去找别的女生,如果能找到别的女生,这个就归我了,于是结束,找到自己喜欢的女生了。
            {
                match[j]=x;
                return true;
            }
        }
    }
    return false;//如果都不能得到,可能就是爱而不得吧。
}

int main(void)
{
    memset(h,-1,sizeof h);
    scanf("%d%d%d",&n1,&n2,&m);
    while(m--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b);
    }
    int res=0;
    for(int i=1;i<=n1;i++)//对每个男生进行一个遍历
    {
        memset(st,false,sizeof st);
        if(find(i))//要是能找到对象
        res++;
    }
    printf("%d",res);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AcWing 861. 二分图的最大匹配 的相关文章

随机推荐