浅谈算法_二分图匹配

浅谈算法_二分图匹配

定义

二分图

简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为两个不相交集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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GS算法二分图匹配算法都是用于解决匹配问题的算法二分图匹配算法是一种通用的算法,用于解决二分图中的匹配问题。而GS算法则是二分图匹配算法的一个特殊案例。 GS算法是基于婚姻匹配问题的研究而提出的。它的核心原理是男生按照自己喜好的顺序向女生发起追求,并尽可能形成稳定的匹配。如果有更好的匹配出现,就会断开之前的匹配,并与新的匹配对象建立关系。 二分图匹配算法则是一种更一般化的算法,适用于解决二分图中的匹配问题。它的原理也是通过不断调整匹配关系,使得每个节点都能够得到匹配。不同于GS算法二分图匹配算法并没有定义匹配的好坏,只关注是否存在匹配。 总结来说,GS算法二分图匹配算法的一个特例,它专门用于解决婚姻匹配问题,而二分图匹配算法则适用于一般的二分图匹配问题。两者的核心原理是类似的,都是通过调整匹配关系来达到稳定的匹配状态。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [详解匈牙利算法二分图匹配](https://blog.csdn.net/wangxiao7474/article/details/111945752)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值