题目大意:
定义:
一个不含圈的有向图G中,G的一个路径覆盖是一个其结点不相交的路径集合P,图中的每一个结点仅包含于P中的某一条路径。路径可以从任意结点开始和结束,且长度也为任意值,包括0。请你求任意一个不含圈的有向图G的最小路径覆盖数。
数据有T组,每组给出N个顶点,M条边,分别求出最小路径覆盖数。
n<=120
题解:
根据定理:
最小路径覆盖数=G的定点数-最小路径覆盖中的边数
最小路径覆盖数=原图G的顶点数-二分图的最大匹配数
跑匈牙利找出最大匹配数然后用N减去即可。
代码:
var
map:array [0..151,0..151] of boolean;
cover:array [0..151] of boolean;
link:array [0..151] of longint;
ans,x,y,i,n,m,t:longint;
function find(x:longint):boolean;
var
q,i:longint;
begin
for i:=1 to n do
if (map[x,i]) and (not(cover[i])) then
begin
q:=link[i];
link[i]:=x;
cover[i]:=true;
if (q=0) or (find(q)) then exit(true);
link[i]:=q;
end;
exit(false);
end;
begin
readln(t);
while t>=1 do
begin
readln(n);
readln(m);
fillchar(map,sizeof(map),false);
fillchar(link,sizeof(link),0);
for i:=1 to m do
begin
readln(x,y);
map[x,y]:=true;
end;
ans:=0;
for i:=1 to n do
begin
fillchar(cover,sizeof(cover),false);
if find(i) then inc(ans);
end;
writeln(n-ans);
dec(t);
end;
end.