呜。。晚上趁着有空把网络流24题的第一题在本机上A掉了,明早到LJOJ去提交~
裸的二分图最大匹配
网络流做法就是在左边搞个源点,右边搞个汇点
然后源点和左半个图,汇点和右半个图之间连上流量为1的边
左半个图和右半个图之间连上流量为maxlongint的边
然后跑一边最大流就AC辣~~
Code:
const shuru='air.in';
shuchu='air.out';
var next,t,sap:array[0..2003] of longint;
queue,d,cur,headlist:array[0..203] of longint;
vis:array[0..203] of boolean;
m,front,finish,num,x,y,i,j,k,n,ans:longint;
procedure init;
begin
assign(input,shuru);
assign(output,shuchu);
reset(input);
rewrite(output);
readln(m,n);
for i:=1 to m+n+2 do headlist[i]:=-1;
readln(X,y);
num:=-1;
while (x<>-1) and (y<>-1) do
begin
inc(num);
next[num]:=headlist[x];
headlist[x]:=num;
t[num]:=y;
sap[num]:=maxlongint;
inc(num);
next[num]:=headlist[y];
headlist[y]:=num;
t[num]:=x;
sap[num]:=0;
readln(x,y);
end;
close(input);
for i:=1 to m do
begin
inc(num);
next[num]:=headlist[n+m+1];
headlist[n+m+1]:=num;
t[num]:=i;
sap[num]:=1;
inc(num);
next[num]:=headlist[i];
headlist[i]:=num;
t[num]:=n+m+1;
sap[num]:=0;
end;
for i:=m+1 to m+n do
begin
inc(num);
next[num]:=headlist[i];
headlist[i]:=num;
t[num]:=n+m+2;
sap[num]:=1;
inc(num);
next[num]:=headlist[n+m+2];
headlist[n+m+2]:=num;
t[num]:=i;
sap[num]:=0;
end;
end;
function BFS:boolean;
var i:longint;
begin
fillchar(vis,sizeof(Vis),false);
vis[n+m+1]:=true; queue[1]:=n+m+1; front:=1; finish:=1;
while finish>=front do
begin
i:=headlist[queue[front]];
while i<>-1 do
begin
if not(vis[t[i]]) and (sap[i]>0) then begin
vis[t[i]]:=true;
inc(finish);
queue[finish]:=t[i];
d[t[i]]:=d[queue[front]]+1;
end;
i:=next[i];
end;
inc(Front);
end;
exit(vis[n+M+2]);
end;
function min(A,b:longint):longint;
begin
if a<b then exit(A);
exit(b);
end;
function DFS(x,a:longint):longint;
var i,flow,f:longint;
begin
if (x=n+m+2) or (A=0) then exit(a);
flow:=0;
i:=cur[x];
while i<>-1 do
begin
if d[t[i]]=d[x]+1 then begin
f:=dfs(t[i],min(a,sap[i]));
if f>0 then begin
flow:=flow+f;
sap[i]:=sap[i]-f;
sap[i xor 1]:=sap[i xor 1]+f;
a:=a-f;
if a=0 then break;
end;
end;
i:=next[i];
cur[x]:=i;
end;
if flow=0 then d[x]:=-1;
exit(flow);
end;
procedure main;
begin
init;
while BFS do
begin
for i:=1 to n+m+2 do cur[i]:=headlist[i];
ans:=ans+dfs(n+m+1,maxlongint);
end;
writeln(Ans);
close(output);
end;
begin
main;
end.