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

来源:互联网 发布:海康ntp服务器地址端口 编辑:程序博客网 时间:2024/05/23 22:44

题目大意

  定义:一个不含圈的有向图G中,G的一个路径覆盖是一个其结点不相交的路径集合P,图中的每一个结点仅包含于P中的某一条路径。路径可以从任意结点开始和结束,且长度也为任意值,包括0。请你求任意一个不含圈的有向图G的最小路径覆盖数。

 

分析

  设所求路径条数为p,所有路径所包含边总数为e,则易得p=n-e(定理1或证明1),要求最小的p就是求最大的e(即使得路径末尾的点数最少)。

  现在问题在于如何求最大的e:我们将有向图转化为无向图,有向图的每个点拆成X集i和Y集i',接下来:

    1.若图中存在点i—>j,则二分图中i与i'相连

    2.求最大匹配m(e)

    3.ans=n-m

  应用很多,比如导弹拦截。

 

  定理1:

  每一条覆盖路径的边数=覆盖点数-1(即减去了路径末尾的那个顶点)

 

  证明1:

  一开始覆盖N个节点的是N条路径,设每个路径为一个集合,则每添加一条边,就合并两个集合(因为是无环图,所以集合内的节点不会互相连接),所以边越多,则集合越少,所以最小路径覆盖仅适合添加一条边能够合并两条路径的题目。

 

代码

type  arr=record    x,y,w:longint;    next:longint;end;var  a:array[1..10000] of arr;  v:array[1..30000] of boolean;  st,ls:array[1..30000] of longint;  i,j:longint;  n,m,nm:longint;  k:char;  t,t1:longint;function find(r:longint):boolean;var  i,j,k:longint;begin  find:=true;  i:=ls[r];  while i<>0 do    begin      with a[i] do        if not v[y]          then            begin              k:=st[y]; st[y]:=r; v[y]:=true;              if (k=0) or find(k) then exit;              st[y]:=k;            end;      i:=a[i].next;    end;  find:=false;end;procedure main;var  i,j,k:longint;  z:boolean;begin  for i:=1 to n do    begin      fillchar(v,sizeof(v),0);      z:=find(i);    end;end;begin  readln(t);  for t1:=1 to t do begin  readln(n);  readln(m);  nm:=0;  fillchar(st,sizeof(st),0);  fillchar(ls,sizeof(ls),0);  for i:=1 to m do    begin      nm:=nm+1;      with a[nm] do            begin              readln(x,y);              next:=ls[x];              ls[x]:=nm;            end;    end;  main;  j:=0;  for i:=1 to n do    if st[i]<>0 then j:=j+1;  writeln(n-j);  end;end.


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 感情特别不顺怎么办 留守孩子学习差怎么办 打了绒促没排卵怎么办 把孩子嘴打肿了怎么办 幼儿孩子被打怎么办 老是忍不住打孩子怎么办 孩子不爱学汉字怎么办 小孩心里有阴影怎么办 性格固执的小孩怎么办 看见小孩子就烦怎么办 孩子吃饭不专心怎么办 上课不专心听怎么办 做作业总是走神怎么办 做事注意力不集中怎么办 做事注意力不能集中怎么办 幼儿争抢玩具老师怎么办 孩子不专心学习怎么办 一年级孩子学习边学边忘怎么办 对爱不专心怎么办 孩子脑子不灵活怎么办 小孩写作业心慌怎么办 4岁写数字怎么办 孩子做事太慢怎么办 小孩子做事不认真怎么办 员工做事不认真怎么办 做事总是不认真怎么办 孩子上课老是讲话怎么办 孩子上课总讲话怎么办 孩子不求上进怎么办 孩子只知道吃完怎么办 孩子演出前紧张怎么办 儿童写字不专心怎么办 孩子上课没精神怎么办 小孩写字太慢怎么办 儿童上课不集中怎么办 突然头晕迷糊眼花怎么办 自己上课不专心怎么办 颈椎病头晕怎么办才好 孩孑记忆力不好怎么办 上课的时候困怎么办 小学生写字太慢怎么办