浅谈算法_二分图匹配
来源:互联网 发布:福岛核电站事故 知乎 编辑:程序博客网 时间:2024/06/04 23:29
浅谈算法_二分图匹配
定义
二分图
简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为两个不相交集U和V,使得每一条边都分别连接U,V中的顶点。如果存在这样的划分,则此图为一个二分图。二分图的一个等价定义是:不含有「含奇数条边的环」的图。图 1 是一个二分图。
匹配
在图论中,一个「匹配」(matching)是一个边的集合,其中任意两条边都没有公共顶点。
算法大致流程
有一个图:
每一条线都代表一条边,每连一条边都表示一次匹配,现在我们想让左边匹配到的点最多。
那么,我们考虑,先给第一个点连边,用贪心的策略,使能匹配到的点最多。
首先:
我们用左边的第一个点连向了右边的第一个点(左边第一个点的第一条边)。
接着开始匹配第二个点:
发现与第一个点重合了,就往回找第一个点有没有其他连边,发现第一个点与右边第而个点有连边,于是我们更改它的连边(递归回去):
发现两个都可以,便继续往下做:
又发现有边已经连了,再次回去更改连边:
发现又被连了,便再回去改第二个点的匹配:
发现没有被匹配到,皆大欢喜。
继续做最后一个点,只有一条边,连上就好了:
至此匹配过程完成!
更有趣的讲解:
http://blog.csdn.net/dark_scope/article/details/8880547
主要代码
link:array[0..10000]of longint; mark:array[0..10000]of boolean; map:array[0..100,0..1000]of boolean; i,s,n,m,t,x,y:longint;function find(t:longint):boolean;var i,q:longint;begin for i:=1 to m do if (not mark[i])and(map[t,i]) then begin q:=link[i]; link[i]:=t; mark[i]:=true; if (q=0)or(find(q)) then exit(true); link[i]:=q; end; exit(false);end;begin readln(n,m,t); for i:=1 to t do begin readln(x,y); map[x,y]:=true; end; fillchar(link,sizeof(link),0); s:=0; for i:=1 to n do begin fillchar(mark,sizeof(mark),0); if find(i) then inc(s); end; writeln(s);end.
习题
有兴趣的可以做做这几题:
【东莞市选2008】导弹:http://172.16.0.132/senior/#main/show/1015
【NOIP2013模拟联考3】沙耶的玩偶(doll):http://172.16.0.132/senior/#contest/show/2100/2
- 浅谈算法_二分图匹配
- 【算法】图论_二分图_匹配
- 二分匹配_最佳匹配KM算法
- BZOJ 1433 浅谈二分图匹配及匈牙利算法
- 二分图的最大匹配_匈牙利算法
- ACM_模板_二分图匹配(匈牙利算法)-DFS
- POJ二分匹配总结_匈牙利算法
- Poj1469_匈牙利算法_最大二分匹配
- 二分图匹配_裸题
- 二分图匹配算法
- 二分图匹配算法
- 二分图匹配:匈牙利算法
- 二分图匹配算法总结
- 二分图匹配算法模板
- 二分图匹配【KM算法】
- 二分图匹配算法总结
- 二分图匹配算法总结
- 二分图匹配算法总结
- 为自己做的小计划 (电影类)
- 河南多校赛(4)GJJ来签到
- 贪心算法解析
- ShaderLab: Pass
- 面向对象的创建
- 浅谈算法_二分图匹配
- [编程题] 等差数列
- 今日头条频道管理(简易shixian)
- mysql------数据库及服务器优化
- Yet another Number Sequence UVA
- CSS3自定义滚动条样式
- 将maven项目打包成可执行的jar
- SIFT特征提取分析
- 信号与槽的详解