最小路径覆盖=总结点数-最大匹配数

这也是我第一道最小路径覆盖题,一开始没学,也没读清题目,就直接以为是最小点覆盖了...(以后要读清题目啊~囧),今后还得注意最小路径覆盖和最小点覆盖的区别啊,其他的都没什么了,最后提醒:poj上的数据输入格式有问题,路口数和道路数在同一行!!!(这也是在discuss上看到的,虽然看discuss不是什么好习惯...)

贴个程序

 program poj1422;
type
  node=record
    x,y,next:integer;
  end;
var
  g:array[1..120*120] of node;
  first,link:array[1..120] of integer;
  used:array[1..120] of boolean;
  i,k,x,m,n,ans:longint;
  flag:boolean;
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
  readln(x);
  for k:=1 to x do
  begin
    fillchar(g,sizeof(g),0);
    fillchar(link,sizeof(link),0);
    readln(n,m);
    for i:=1 to n do
      first[i]:=-1;
    for i:=1 to m 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);
      flag:=find(i);
    end;
    ans:=n;
    for i:=1 to n do
      if link[i]<>0 then dec(ans);
    writeln(ans);
  end;
end.