笔试|二分图最大匹配/最小点覆盖问题(增广路、匈牙利算法)

2022-04-16  本文已影响0人  zilla

参考:https://blog.csdn.net/qq_38956769/article/details/80238896

二分图

匹配

在G的一个子图S中,S的边集中的任意两条边都不依附于同一个顶点,则称S是一个匹配。

交替路 & 增广路

用于解决新配对时的冲突。交替路即非匹配边、匹配边交替。
一个一个找匹配,出现冲突时,找首尾都是非匹配边的交替路(即,增广路) ,找到后将其取反,此时得到新匹配,匹配点比原先多1个。

匈牙利算法:不断利用增广路找更好的匹配

/************深搜找增广路************/
bool Vis[MAX_N+1];
int Match[MAX_N+1];
bool Dfs(int u){
    for(int i=0;i<Adj[u].size();i++){
        int v=Adj[u][i];
        if(Vis[v])  
            continue;
        Vis[v]=true;
        if(!Match[v]||Dfs(Match[v])){
            Match[v]=u;
            Match[u]=v;
            return true;
        }
    }
    return false;
}
/*********匈牙利算法主函数**********/
void Solve(){
    for(int i=1;i<=n;i++){
        memset(Vis,false,sizeof(Vis));
        if(!Match[i])
            if(Dfs(i))
                ans++;
    }
}

König定理

二分图最小点覆盖的点的数量等于二分图最大匹配的边的数量,即最小点覆盖=最大匹配数。
最小边覆盖(最小的覆盖所有点的边集)=最大独立集(点集,当且仅当它不被包含在一个更大的点集中时)=总节点数-最大匹配数

上一篇下一篇

猜你喜欢

热点阅读