匈牙利算法小心得

原创 2013年12月01日 20:37:47

     一直想写点博客来记录一下自己的学习的点点滴滴,也是为了方便一下自己以后的查询。但是由于自己是在太拖沓了,迟迟没有行动起来,自己都对自己忍无可忍了。所以,下定决心要从今天开始把这件事情给坚持下来。希望自己能再其中不断的成长。

      为了12月15号的一个比赛,今天不迫不得已,又开始复习算法了。以前就看过匈牙利算法,当时也是搞得一知半解的,今天又遇到了,由于时间太久,完全忘记了他是什么东西,又重新学习了一遍。网上的博客资料什么的,好多都是讲得十分粗糙,让我越发的迷惑,好在山重水复疑无路,柳暗花明又一村,终于找到了一篇比较好的博文,让自己开了窍。

    先把博客地址贴出来吧,真是太感谢那位博主了。http://kukumayas.iteye.com/blog/1075610

    博主关于算法的过程和预备知识,那位博主已经讲得非常的清晰和详尽。我也不用再赘述了。知识在此总结一下,自己觉得需要注意的几个点。

 1.匈牙利算法有基于bfs和dfs的,博主的图片是给的基于dfs的。

 2. 算法的核心步骤就是:

   (1)把二分图分成两个集合A,B。并在进行最大匹配之前,做一些初始化的工作。

    (2)对于A中每一个节点要做的操作就是:从该节点顺序去找B中与之连通的节点g,g节点已经包含在M之中,则试图再从g出发去找到一条交错路径/增广路径。如果找到了则更新M。否则则继续查找下一个节点。

3.代码,这是百度文库里面的代码,写得非常的清晰和详尽。

#include <stdio.h>
#include <string.h>
int n1,n2,m,ans;
int result[101]; //记录V2中的点匹配的点的编号
bool state [101]; //记录V2中的每个点是否被搜索过
bool data[101][101];//邻接矩阵 true代表有边相连
void init() {
    int t1,t2;
    memset(data,0,sizeof(data));
    memset(result,0,sizeof(result));
    ans = 0;
    scanf("%d%d%d",&n1,&n2,&m);
    for (int i = 1; i <= m; i++) {
        scanf("%d%d",&t1,&t2);
        data[t1][t2] = true;
    }
    return;
}
bool find(int a) {
    for (int i = 1; i <= n2; i++) {
        if (data[a][i] == 1 && !state[i]) { //如果节点i与a相邻并且未被查找过,对于每一个节点使之往后查找新的匹配节点
            state[i] = true; //标记i为已查找过
            if (result[i] == 0 //如果i未在前一个匹配M中
            || find(result[i])) { //i在匹配M中,但是从与i相邻的节点出发可以有增广路,在进行这个递归查询的时候,其实就已经就实现了,断开增广路径,增加一条匹配记录的效果
                result[i] = a; //记录查找成功记录
                return true; //返回查找成功
            }
        }
    }
    return false;
}
int main() {
    init();
    for (int i = 1; i <= n1; i++) {//对每一个节点进行同样的操作
        memset(state,0,sizeof(state)); //清空上次搜索时的标记
        if (find(i)) ans++; //从节点i尝试扩展
    }
    printf("%d\n",ans);
    return 0;
}

好吧,其实自己对该算法的理解还过于肤浅,今天只是做一下笔记,以免忘记。真正核心,自己理解的东西,还需要自己多刷两道题,过两天再补上。继续加油吧!!!

安装软件的一点心得

这几天因为工作的原因要接收别人的代码,
  • u012043458
  • u012043458
  • 2014年04月15日 21:25
  • 782

暑假一个月学习心得(Arduino硬件)

不知不觉,暑假已经过去了一大半,马上就
  • Two_dogs
  • Two_dogs
  • 2014年08月20日 15:55
  • 1998

关于多线程的学习心得

1.web应用中,要对某一个任务用多线程实现,最简单的代码格式是不是必须把要执行的代码放在run方法中? WEB服务器会帮你把每个访问请求开辟一个线程,你只要按照你所开发的框架,比如tomcat会让...
  • u012079766
  • u012079766
  • 2016年03月14日 19:30
  • 490

一点论文写作心得

论文对于硕士,尤其博士,是必须的一种技能,也是一道难关。所谓大道无形,小道可走。下面给出一些博士期间的写作心得,希望能有所裨益。论文可以有三个境界:毕业、科研、贡献。 现在只说第一个,为了毕业。...
  • u012116229
  • u012116229
  • 2015年02月28日 17:32
  • 370

C#学习心得与自我反思

今天都学了什么知识呢,想知道么,也不卖关子了,今天呢学习了变量与分支语句、循环、数组、枚举(enum),结构(struct)等知识,这些知识跟java差不多,没什么区别,枚举呢,本来就不是很好,所以就...
  • MaBackspace
  • MaBackspace
  • 2016年06月28日 19:25
  • 584

jquery使用心得

1,普通获取某个控件 ${'#id'}  赋值 ${'#id'}.val('new value') 或 ${'#id'}.attr('val','new value')   id = “pojo.na...
  • z3636081
  • z3636081
  • 2015年09月11日 14:50
  • 127

关于MVC的一些小心得

MVC一般搞程序的都知道,不知道就问百度。 这里还是分享MVC的小模板,不过这个是手打的: Model:Name(唯一标识,字段),SendEvent(虚方法,给Controller发送事件) ...
  • zzw8866755
  • zzw8866755
  • 2016年09月21日 09:21
  • 142

作为面试官的一点心得

转载原文:基础知识漫谈(6-2) 作为面试官的一点心得 以当前的现状来看,优秀的毕业生会先被知名的大企业刷过一轮,那么,相对不知名的企业招聘负责人要如何找到适合自己公司的技术人才呢?询问过一些毕业...
  • mlc1218559742
  • mlc1218559742
  • 2016年10月11日 18:57
  • 930

《计算机网络》读书心得

《计算机网络》读书心得 秦川 简言:科学技术日新月异蓬勃发展,从上世纪90年代初迅速发展起来的计算机网络技术,已经飞速改变了人们的生活和工作。现在已经成为我们获取、学习、掌握知识的重要方法,在人们...
  • iqinchuan
  • iqinchuan
  • 2015年03月05日 18:17
  • 759

学习Opencv的小心得

最近有学习一下OPencv,发现里面的水还是很深,并没有我想的那么简单。我现在的项目主要是关于一些数学计算,里面包括一些矩阵的计算,有用到矩阵乘法,于是对于我 这种菜鸟来说,当然第一想到的就是百度。没...
  • yiting1108
  • yiting1108
  • 2015年11月11日 21:14
  • 218
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:匈牙利算法小心得
举报原因:
原因补充:

(最多只允许输入30个字)