博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分图匹配
阅读量:4315 次
发布时间:2019-06-06

本文共 1910 字,大约阅读时间需要 6 分钟。

先来讲一个需要用到的定理(太懒不想打)

 

     KONIG定理的证明

转自我左边的xyy大佬

  • 定理内容:二分图最小点覆盖数等于最大匹配数。

  • 证明:

假设现在已经找出了二分图最大匹配,匹配数为 n,为了证明定理,需要证明

一、n个点可以覆盖所有边

对于当前已经取出最大匹配的二分图,只存在以下三种边:1匹配边,2一个点盖一个点未盖的非匹配边(左盖右未盖和左未盖右盖),3左盖右盖。 

从未盖点搜索增广路(虽然已经不存在了,但用同样的方法搜),搜到的路径结尾一定是同侧的盖点,因为如果找到了异侧的未盖点就产生了增广路,与条件不符。对于这样的一条路(”W”形),如果有k个匹配,就可以用k个点覆盖。于是第2种边已经被完全覆盖了。 
再看剩下的,没有被未盖点搜到的,由1和3组成的交错路(”N”形,第一条和最后一条边均为1匹配边),如果有k个匹配,也可以用k个点覆盖。 
由此,3种边已经全部被覆盖,并且因为被未盖点搜到的匹配边和搜不到的匹配边没有交集,且并集即所有匹配边(仿佛是废话),所以我们只用了每个匹配边的一个节点,所以n个点可以覆盖所有边得证。

二、少于n个点不能覆盖所有边

考虑从已选的点中去掉一个。 

如果这个点在”W”形路上,无论如何也无法覆盖所有边。 
如果在”N”形路上也一样。(仿佛也是废话)

于是就愉快地得出了扣你吉定理。实际上他的得出还是依赖于匈牙利算法找增广路的思路。


 

 

以下是一个模板题

A - 最大匹配

 题意:一共有N个学生跟P门课程,一个学生可以任意选一门或多门课,问是否可行。

1.每个学生选的都是不同的课(即不能有两个学生选同一门课)

  2.每门课都有一个代表(即P门课都被成功选过)

题解:就是匈牙利算法啦(题目输入和处理有点毒),还有最后输出大写YES。。。。

1 var 2 map:array[0..600,0..600]of longint; 3 mx,my:array[0..2000] of longint; 4 vis:array[0..2000] of boolean; 5 p,m,t,i,l,ans,x,j,y:longint; 6  7 function dfs(s:longint):boolean; 8  var i:longint; 9  begin10    for i:=1 to m do11     begin12       if (map[s,i]=1)and(not vis[i])  then13         begin14          vis[i]:=true;15           if (my[i]=0)or(dfs(my[i])) then//当前这个点未被访问或者是一条增广路16              begin17               mx[s]:=i;// 左边点s对应右边点i18               my[i]:=s;19               exit(true);//可行返回true20             end;21        end;22     end;23     exit(false);24  end;25 begin26  readln(t);27 for l:=1 to t do28 begin29    fillchar(map,sizeof(map),0);30    fillchar(mx,sizeof(mx),0);31   fillchar(my,sizeof(my),0);32  readln(p,m);33  for i:=1 to p do34   begin35     read(x);36     for j:=1 to x do37      begin38        read(y);39        map[i,y]:=1;40      end;41      readln;42   end;43 44   ans:=0;45   for i:=1 to p do//用课程匹配学生46    begin47      fillchar(vis,sizeof(vis),false);48      if dfs(i) then inc(ans);49    end;50 51    if ans=p then  writeln('YES') else writeln('NO');52 end;53 end.

 

转载于:https://www.cnblogs.com/brilliant107/p/9430803.html

你可能感兴趣的文章
访问修饰符、封装、继承
查看>>
更换pip源到国内镜像,提升pip下载速度.
查看>>
POJ 2265 Bee Maja (找规律)
查看>>
Kendo MVVM 数据绑定(七) Invisible/Visible
查看>>
[zz]kvm环境使用libvirt创建虚拟机
查看>>
bzoj1059 [ZJOI2007]矩阵游戏
查看>>
插入返回ibatis 的selectKey 实现插入数据后获得id
查看>>
vim 程序编辑器
查看>>
LIS(单调队列优化 C++ 版)(施工ing)
查看>>
刚接触Vuex
查看>>
四种加载React数据的技术对比(Meteor 转)
查看>>
Airthmetic_Approching
查看>>
操作文本文件
查看>>
公司项目的几个问题
查看>>
解决win7下打开Excel2007,报“向程序发送命令时出现问题”的错误
查看>>
Velocity快速入门教程
查看>>
关于集合常见的问题
查看>>
车牌正则表达式
查看>>
Win form碎知识点
查看>>
避免使用不必要的浮动
查看>>