匈牙利算法(codevs2776)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了匈牙利算法(codevs2776)相关的知识,希望对你有一定的参考价值。

type node=^link;
 link=record
   des:longint;
   next:node;
    end;

var
 n,m,i,t,num:longint;
 p:node;
 nd:array[1..200] of node;
 mat:array[1..200] of longint;
 vis:array[1..200]  of boolean;
 sel:array[1..200] of longint;

 function find(po:longint):boolean;
 var
  p:node;
   begin
     p:=nd[po];
     while p<>nil do
      begin
        if vis[p^.des]=false then
          begin
            vis[p^.des]:=true;
            if sel[p^.des]=0 then
              begin
                sel[p^.des]:=po;
                mat[po]:=p^.des;
                exit(true);
              end else
            if find(sel[p^.des])=true then
              begin
                sel[p^.des]:=po;
                mat[po]:=p^.des;
                exit(true);
              end;
          end;
         p:=p^.next;
      end;
     exit(false);
   end;

  begin

    read(n,m);

    for i:=1 to n do
      begin
        read(t);
        while t<>0 do
          begin
            new(p);p^.next:=nd[t];p^.des:=i;nd[t]:=p;
            read(t);
          end;
      end;

    for i:=1 to m do
      if mat[i]=0 then
        begin
          fillchar(vis,sizeof(vis),0);
          if find(i) then inc(num);
        end;

    writeln(num);

  end.

另外,

最小点覆盖数=最大匹配数 
最大独立集=顶点数-最大匹配数
最小路径覆盖数 = 顶点数 - 最大匹配数

 

以上是关于匈牙利算法(codevs2776)的主要内容,如果未能解决你的问题,请参考以下文章

codevs1022覆盖(匈牙利算法)

匈牙利算法实战codevs1022覆盖

CODEVS2776寻找代表元

codevs.cn 2776寻找代表元 最大流解法

寻找代表元(codevs 2776)

矩阵游戏|ZJOI2007|BZOJ1059|codevs1433|luoguP1129|二分图匹配|匈牙利算法|Elena