最近做了一套匹配的题,然后就想简单的写一下 关于二分图匹配的问题。
首先二分图匹配是给N个人 分配P个任务,每个人对应一个任务,问能够匹配到的个数,而当个数最多是,这就是我们说的二分图的最大匹配,当每个人都有任务时,就是我们说的完美匹配。
那么这种问题应该如何求解呢?
(当然,我们可以增加一个源点和汇点变成最大流问题)

当然我们也可以通过另外一种方法

现在我们假设我们通过dfs 不断寻找增广路来实现二分图的最大匹配
具体思想就是,比如说,我们有小①和小②是一对,这时候小③过来要和小①在一起,那么这时候有两种办法 一种是让小③走开,另一种就是让小②去找小④,小②已经和小①配对了,我们去看看有没有小④,如果有小④,那么就可以配成两对,如果没有,就只能配成一对。当遇到冲突时,如果我能找到一种方法,让之前的配对的每个人都找到另外的配对,那么这样就会增加一个配对。 也就是所说的通过走交替路找到一条增广路。
模板如下:

vector<int>G[maxn];
int match[maxn];
bool used[maxn];
void add_edge(int u,int v)
{
    G[u].push_back(v);
    G[v].push_back(u);
}
bool dfs(int v)
{
    used[v]=true;
    for(int i=0;i<G[v].size();i++)
    {
        int u=G[v][i];
        int w=match[u];
        if(w<0||!used[w]&&dfs(w))//就是dfs寻找一个增广路
        {
            match[v]=u; 
            match[u]=v;
            return true;
        }
    }
    return false;
}
int bipartite_matching()
{
 int res=0;
 memset(match,-1,sizeof(match));
 for(int v=0;v<20;v++)
 {
    if(match[v]<0)
    {
        memset(used,0,sizeof(used));
    if(dfs(v))
    {
        res++;
    }
    }
 }
 return res;
}