匈牙利算法

用途

最小路径覆盖用二分图匹配

算法

首先这里有4个同学和四包零食,其中红色的线代表这个人喜欢这包零食。
匈牙利算法_第1张图片
一号同学说:“A这包零食是我的了!你们谁也别抢!”
二号同学说:“B这包零食是我的了!”
三号同学说:“2号你一边去,B这包零食是我的!”
由于二号同学很友善,于是他将B这包零食让给三号同学,自己去抢C零食了。
这时,四号同学发现自己喜欢的零食被抢走了,于是他很无奈的叹了一口气。

代码

function find(k:longint):boolean;
var i:longint;
begin
    if bz[k]=ii then exit(false);//这包零食已经被抢了
    bz[k]:=ii;
    i:=last[k];
    while i<>0 do
    begin
        if (b[go[i]]=0)or(find(b[go[i]])) then//有同学肯让零食或这包零食目前没人抢
        begin
            b[go[i]]:=k;
            exit(true);
        end;
        i:=next[i];
    end;
    exit(false);
end;

注意:这是数组模拟链表,不是邻接矩阵。

你可能感兴趣的:(匈牙利算法)