二分图匹配

来源:互联网 发布:2016年网络诈骗追回率 编辑:程序博客网 时间:2024/06/06 01:32

最近做了一套匹配的题,然后就想简单的写一下 关于二分图匹配的问题。
首先二分图匹配是给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;}
原创粉丝点击