码迷,mamicode.com
首页 > 编程语言 > 详细

匈牙利算法(codevs2776)

时间:2016-02-24 15:36:16      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

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)

标签:

原文地址:http://www.cnblogs.com/zhujiangning/p/5213016.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!