切换到宽版
  • 8212阅读
  • 0回复

看下这个二分匹配哪错了〉 [复制链接]

上一主题 下一主题
离线勇气les
 
只看楼主 正序阅读 0 发表于: 2007-03-17
const
maxn=50;
var
a:array[1..maxn,0..maxn]of longint;
g,b,d:array[1..maxn]of longint;
u:array[1..maxn*2]of boolean;
i,n,m,k,l,ans:longint;
f:boolean;

procedure sub(x:longint);
var i,j:longint;
begin
if f then exit;
for i:=1 to a[x,0] do if (not u[a[x,i]+n])and(b[a[x,i]]=0) then begin
  inc(l);d[l]:=a[x,i];
  for j:=1 to (l div 2) do begin
    g[d[j*2-1]]:=d[j*2];
    b[d[j*2]]:=d[j*2-1];
  end;
  inc(ans);
  f:=true;
  exit;
end;
for j:=1 to a[x,0] do begin
  i:=a[x,j];
  if (not u[i+n])and(b<>0)and(not u[b]) then begin
  inc(l);
  d[l]:=i;
  inc(l);
  d[l]:=b;
  u[i+n]:=true;
  u[b]:=true;
  sub(b);
  l:=l-2;
end;
end;
end;


begin
assign(input,'a.in');reset(input);
assign(output,'a.out');rewrite(output);
k:=1;
while k<>0 do begin
  read(k,n,m);
  fillchar(a,sizeof(a),0);
  fillchar(g,sizeof(g),0);
  fillchar(b,sizeof(b),0);
  for i:=1 to k do begin
    read(k,l);
    inc(a[k,0]);
    a[k,a[k,0]]:=l;
  end;
  ans:=0;
  for i:=1 to n do if g=0 then begin
    f:=false;
    fillchar(u,sizeof(u),0);
    u:=true;
    l:=1;
    d[l]:=i;
    sub(i);
  end;
  writeln(ans);
  read(k,n,m);
end;
close(input);
close(output);
end.
快速回复
限100 字节
 
上一个 下一个