最小点覆盖数=最大匹配数

把横,纵坐标分别作为二分图的两个集合,每个点的横纵坐标连一条边,求二分图的最小点覆盖数,也就是最大匹配数,用匈牙利算法,都没什么好说的

 

program poj3041;
type
  node=record
    x,y,next:integer;
  end;
var
  n,k,i,ans:integer;
  g:array[1..10000] of node;
  used:array[1..500] of boolean;
  first,link:array[1..500] of integer;
function find(s:integer):boolean;
var
  temp:integer;
begin
  find:=true;
  temp:=first[s];
  while temp<>-1 do
  begin
    if not used[g[temp].y] then
    begin
      used[g[temp].y]:=true;
      if (link[g[temp].y]=0) or (find(link[g[temp].y])) then
      begin
        link[g[temp].y]:=s;
        exit;
      end;
    end;
    temp:=g[temp].next;
  end;
  find:=false;
end;
begin
  fillchar(g,sizeof(g),0);
  fillchar(link,sizeof(link),0);
  readln(n,k);
  for i:=1 to n do
    first[i]:=-1;
  for i:=1 to k do
  begin
    readln(g[i].x,g[i].y);
    g[i].next:=first[g[i].x];
    first[g[i].x]:=i;
  end;
  for i:=1 to n do
  begin
    fillchar(used,sizeof(used),false);
    find(i);
  end;
  ans:=0;
  for i:=1 to n do
    if link[i]<>0 then inc(ans);
  writeln(ans);
end.