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

二分图 (匈牙利算法)

时间:2015-03-11 16:55:29      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

二分图的匈牙利算法

二分图的难点主要在建图;

关于二分图的几个重要公式:

    最大匹配数=最小点覆盖

    最小边覆盖=顶点总数-最大匹配数/2 (这个要拆点:uN=vN=cnt,ans=cnt-hungary/2)

    最大团=补图最大独立集

    最大独立集=顶点数-最大匹配

匈牙利算法:

技术分享
int link[maxn];
vector<int>G [maxn];
int uN,vN;
bool vis[maxn];

bool dfs(int u)
{
    for(int i=0;i<G[u].size();i++){  //取出u的下一个未访问过的点v
        int v=G[u][i];
        if(!vis[v]){
            vis[v]=1;
            if(link[v]==-1||dfs(link[v])){  //如果link[v]==-1或dfs(link[v]),反转:link[v]=u;
                link[v]=u;
                return true;
            }
        }
    }
    return false;
}

int hungary()
{
    int res=0;
    memset(link,-1,sizeof(link));  //初始化link数组
    for(int u=1;u<=uN;u++){
        memset(vis,0,sizeof(vis));  //注意每次需初始化vis数组
        if(dfs(u)) res++;
    }
    return res;
}
hungary算法

采用vector代替邻接矩阵模拟邻接表,提高效率又不增加代码量 (其实是我还没掌握好邻接表。。) 

 

二分图 (匈牙利算法)

标签:

原文地址:http://www.cnblogs.com/--560/p/4330134.html

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