POJ 3692(匈牙利算法)


匈牙利算法:

b[]保存当前找交错路P的各点是否已被连通,a[]表示某点之前的点

本题的2分图是取最大团(各点互相连通),利用2分图性质,可看成补图的最大独立集(各点互不连通)……



Program P3692;
const
   maxn=200;

var
   n,m,l,i,j,k,ans,x,y:longint;
   b:array[1..400] of boolean;
   map:array[1..400,1..400] of boolean;
   a:array[1..400] of longint;
function find(x:longint):boolean;
var
   i,j:longint;
begin
   for i:=1 to m do
      if not(b[i]) and (map[x,i]) then
      begin
         b[i]:=true;
         if a[i]=0 then begin a[i]:=x; exit(true); end;
         if find(a[i]) then begin a[i]:=x; exit(true); end;
      end;

   exit(false);
end;
begin
   i:=1;
   read(n,m,l);
   while (n+m+l>0) do
   begin
      ans:=0;
      fillchar(a,sizeof(a),0);
      fillchar(map,sizeof(map),true);
      for k:=1 to l do
      begin
         read(x,y);
         map[x,y]:=false;
      end;
      for k:=1 to n do
      begin
         fillchar(b,sizeof(b),false);
         if find(k) then inc(ans);
      end;
      writeln('Case ',i,': ',n+m-ans);
      inc(i);
      read(n,m,l);
   end;
end.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值