二分图匹配

原创 2017年10月11日 21:33:57

最近做了一套匹配的题,然后就想简单的写一下 关于二分图匹配的问题。
首先二分图匹配是给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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

二分图匹配问题

  • 2013年06月05日 16:29
  • 355KB
  • 下载

线性规划.网络流.二分图匹配

  • 2012年06月09日 11:50
  • 401KB
  • 下载

loj6002「网络流 24 题」最小路径覆盖(最小路径覆盖+二分图最大匹配)

求有向无环图的不相交最小路径覆盖。把原图的每个点V拆成Vx和Vy两个点,如果有一条有向边A->B,那么就加边Ax−>By。这样就得到了一个二分图。那么最小路径覆盖=原图的结点数-新图的最大匹配数。证明...

用匈牙利算法求二分图的最大匹配

  • 2011年08月08日 08:29
  • 1.05MB
  • 下载

二分图的最优匹配算法

  • 2012年09月21日 21:42
  • 139KB
  • 下载

bzoj4554 [Tjoi2016&Heoi2016]游戏(二分图最大匹配)

首先考虑如果没有软硬石头的话,答案就是min(n,m),如果只有软石头的话,就是相当于限制了某些点不能放,可以用行和列建二分图,跑最大匹配。如果有硬石头的话,相当于把原来的一行(列)分成了两部分,都可...

二分图最大匹配km算法

  • 2013年11月04日 19:30
  • 127KB
  • 下载

二分图完备匹配(匈牙利算法)

  • 2010年01月12日 10:45
  • 2KB
  • 下载

带权二分图的最佳匹配(KM算法)

还是没看懂一般图都是最大匹配问题。。怪我太笨了哎~ 先来个看明白了的KM算法——寻找带权二分图的最佳匹配方法 一般对KM算法的描述,基本上可以概括成以下几个步骤: (1) 初始化可行标杆 (...
  • x_y_q_
  • x_y_q_
  • 2016年07月16日 23:17
  • 3151

二分图匹配

  • 2015年08月08日 14:47
  • 209KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二分图匹配
举报原因:
原因补充:

(最多只允许输入30个字)