码迷,mamicode.com
首页 > 编程语言 > 详细

匈牙利算法基础

时间:2019-02-11 14:15:15      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:its   cas   amp   using   print   存在   最小顶点覆盖   需要   scan   

用来求 二分图最大匹配

并且 最小顶点覆盖==最大匹配

 

#include<bits/stdc++.h>
using namespace std;

int mp[105][105];//图
int used[106];//记录循环每次使用情况
int vis[105];//记录的是匹配情况 
int n,m;//n为左图  m为右图
bool dfs(int  x)
{
    for(int j=0;j<m;j++)
    {
        if(mp[x][j]&&!used[j])
        {
            used[j]=1;
            if(!vis[j]||dfs(vis[j]))
              {
                  vis[j]=x;
                  return true;
              }
        }
    }
    return false;
}


int main()
{
    int k,cas,x,y;
    while(scanf("%d",&n),n)
    {
        memset(mp,0,sizeof(mp));
        memset(vis,0,sizeof(vis));
        
        for(int i=0;i<n;i++)
        {
            memset(used,0,sizeof(used));//每次的使用  需要清除
            if(dfs(i))ans++;
        }
        printf("%d\n",ans);
    }

}

 

 

 

概念:

最大匹配:二分图中边集的数目最大的那个匹配;

最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联;

最小边覆盖:用尽量少的不相交简单路径覆盖有向无环图(DAG)G的所有顶点;

最大独立集:在N个点的图G中选出m个点,使这m个点两两之间没有边的点中,m的最大值。

 

(a)、对于不存在孤立点的图,最大匹配+最小边覆盖=顶点数;
(b)、最大独立集+最小顶点覆盖=顶点数;
二分图中:
(c)、最大匹配=最小顶点覆盖。

 

匈牙利算法基础

标签:its   cas   amp   using   print   存在   最小顶点覆盖   需要   scan   

原文地址:https://www.cnblogs.com/bxd123/p/10361608.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!