算法学习:匈牙利算法

Posted rentu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习:匈牙利算法相关的知识,希望对你有一定的参考价值。

【定义】

【二分图】:整张图可以分成两个点集,集合中点互相之间无通路

【匈牙利算法】

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAX 2147483647
#define MAXN 1010
int match[MAXN];
int book[MAXN];
int t[MAXN][MAXN];
int n,m;
int s;
int dfs(int u)
{
     int i;
     for(i=1;i<=m;i++)//枚举每个结点
      {
         if(book[i]==0&&t[u][i]) //如果这个点没有被访问过,同时有点连接
          {
            book[i]=1;//使其被访问过
            if(match[i]==-1||dfs(match[i]))
                {
                            //如果这个点没有对应的点
                            //如果有,试着让这个点更换另外的点
                            //也就是我下面提到的更新连接对应的方式
                            //这个点和上面的位置连接
                            match[i]=u;
                            return 1;
                            //返回,这个点有连接的状态
                     }
              }
      }            
return 0;
}
int main()
{
    int i;
    scanf("%d%d%d",&n,&m,&s);
    for(i=1;i<=m;i++)
        match[i]=-1;
    int x,y;
    for(i=1;i<=s;i++)
     {
         scanf("%d%d",&x,&y);
         t[x][y]=1;
     }//读取二分图
    int sum=0;
    for(i=1;i<=n;i++)
     { 
       memset(book,0,sizeof(book));
       if(dfs(i))//逐个访问
       sum++;
     }
    printf("%d",sum);
    return 0;
}

以上是高中时候照啊哈算法写的板子,几年前写的,学过之后忘掉了,拿出来再复习一下

具体描述代码注释

我对于这个算法的理解是,
他其实就是一个暴力,暴力的尝试这种方法是否可行,如果可行的的话标记
不可行的话继续向下寻找,通过暴力寻找新的边的排布方式,给所需要扩展的这条边多出来一个位置的话,达到扩展的目地
新的扩展的这条路也有特定的名字,增广路

我觉得他和网络流求二分图匹配相似,无论是时间还是方法上,数据规模也都差不多

以上是关于算法学习:匈牙利算法的主要内容,如果未能解决你的问题,请参考以下文章

匈牙利算法

带花树学习

二分图匹配-匈牙利算法学习

POJ 3041 匈牙利算法模板题

带花树算法学习小记

二分图算法手把手教你学会:染色法(判断二分图)匈牙利算法(二分图的最大匹配)