匈牙利算法基础

用来求 二分图最大匹配

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

#include<bits/stdc++.h>
using namespace std;
#define MAXI 105
int mp[MAXI][MAXI];
int used[MAXI];
int vis[MAXI];
int n,m;
bool dfs(int  x)
{
    for(int j=1;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 find1(void)
{    int ans=0;
 memset(vis,0,sizeof(vis));
     for(int i=1;i<=n;i++)
       {
           memset(used,0,sizeof(used));
           if(dfs(i))ans++;
       }
       return ans;
}

 前向星写法:

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
const int N=1000000+5;
const int M=2000000+5;
int head[M],pos,n,m,flag;
struct Edge
{
    int nex,to;
}edge[M];
void add(int a,int b)
{
    edge[++pos].nex=head[a];
    head[a]=pos;
    edge[pos].to=b;
}
int vis[N],used[N];
bool dfs(int x)
{
    for(int i=head[x];i;i=edge[i].nex)
    {
        int v=edge[i].to;
        if(flag!=used[v])
        {
            used[v]=flag;
            if(!vis[v]||dfs(vis[v]))
            {
                vis[v]=x;
                return true;
            }
        }
    }
    return false;
}
int find1()
{
    int ans=0;
    rep(i,1,n)
    {
        flag++;//用时间戳大大加速
        if(dfs(i))ans++;
        else return ans;
    }
    return ans;
}
View Code

概念:

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

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

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

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

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

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