这是个最小路径覆盖问题,但是因为有的点可以重复访问,所以最小路径是可以相交的,我们就用传递闭包建立新图(G’),转化为一般的路径覆盖,之后求法一样。
var
n,m:longint;
g:array[1..500,1..500]of boolean;
match:array[1..500]of longint;
h:array[1..500]of boolean;
procedure init;
var i,j,k,x,y:longint;
begin
fillchar(g,sizeof(g),0);
fillchar(match,sizeof(match),0);
for i:=1 to m do
begin
readln(x,y);
g[x,y]:=true;
end;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
g[i,j]:=(g[i,j])or(g[i,k] and g[k,j]);
end;
function check(k:longint):boolean;
var i:longint;
begin
for i:=1 to n do
if(g[k,i])and(not h[i])then
begin
h[i]:=true;
if(match[i]=0)or(check(match[i]))then
begin
match[i]:=k;exit(true);
end;
end;
exit(false);
end;
function hungarian:longint;
var i,ans:longint;
begin
ans:=0;
for i:=1 to n do
begin
fillchar(h,sizeof(h),0);
if(check(i))then inc(ans);
end;
exit(ans);
end;
begin
readln(n,m);
while(n<>0)do
begin
init;
writeln(n-hungarian);
readln(n,m);
end;
end.