您的位置:首页 > 其它

最小路径覆盖_zoj1525_最小路径覆盖+水

2016-06-19 12:30 281 查看

[b]Description[/b]
  定义: 一个不含圈的有向图G中,G的一个路径覆盖是一个其结点不相交的路径集合P,图中的每一个结点仅包含于P中的某一条路径。路径可以从任意结点开始和结束,且长度也为任意值,包括0。请你求任意一个不含圈的有向图G的最小路径覆盖数。
 
提示:最小路径覆盖数=G的定点数-最小路径覆盖中的边数
最小路径覆盖数=原图G的顶点数-二分图的最大匹配数
[b]Input[/b]
   t表示有t组数据;n表示n个顶点(n<=120);m表示有m条边;
   接下来m行,每行有两个数i,j表示一条有向边。
[b]Output[/b]
最小路径覆盖数
[b]Sample Input[/b]
2
4
3
3 4
1 3
2 3
3
3
1 3
1 2
2 3
[b]Sample Output[/b]
2
1
[b]思路:[/b]
赤果果的最小路径覆盖,赤果果的模板题
zoj不知道要维修到什么时候,先交上来
最近状态很好啊高产似那啥
[b]源代码/pas:[/b]
 
type
edge=record
x,y,next:Longint;
end;
var
e:array[1..400]of edge;
link,ls:array[0..20]of longint;
v:array[1..20]of boolean;
maxE,n,m,t:longint;
procedure add(x,y:longint);
begin
inc(maxE);
e[maxE].x:=x;
e[maxE].y:=y;
e[maxE].next:=ls[x];
ls[x]:=maxE;
end;
function find(x:longint):boolean;
var
i,k:longint;
begin
find:=true;
i:=ls[x];
while i>0 do
with e[i] do
begin
if not v[y] then
begin
k:=link[y];
link[y]:=x;
v[y]:=true;
if (k=0)or find(k) then exit;
link[y]:=k;
end;
i:=next;
end;
find:=false;
end;
procedure main;
var
i,j,ans:longint;
begin
fillchar(link,sizeof(link),0);
ans:=0;
for i:=1 to n do
begin
fillchar(v,sizeof(v),false);
if find(i) then inc(ans);
end;
writeln(n-ans);
end;
procedure init;
var
i,j,x,y:longint;
begin
fillchar(ls,sizeof(ls),0);
fillchar(e,sizeof(e),0);
maxE:=0;
readln(n,m);
for i:=1 to m do
begin
readln(x,y);
add(x,y);
end;
end;
begin
readln(t);
repeat
init;
main;
dec(t);
until t=0;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: