jzoj P1029【NOIP动态规划专题】电子眼

题目大意:
中山市有N条马路和N个路口,给出ki,ki表示有ki条马路与路口i相连,后面紧跟着ki个数字,表示与路口i直接相连的路口,作为一条交通网络,显然每两个路口之间都是可达的。市长决定在一些路口加装电子眼,用来随时监视路面情况。这些装在路口的电子眼能够监视所有连接到这个路口的马路。现在市长想知道最少需要在多少个路口安装电子眼才能监视所有的马路。市长已经把所有的路口都编上了1~N的号码。 给你中山市的地图,你能帮忙吗?
0<=N<=100000

题解:
f[i,0}表示第i个路口不安装电子眼的最小安装数量。
f[i,1]表示第i个路口安装电子眼的最小安装数量。
因为每两个路口之间都是可达的,所以从任意一个路口开始递归都可以。
f[i,0]=∑f[j,1] j为i直通的路口
f[i,0]=∑min(f[j,0],f[j,1]) j为i直通的路口

var
  a:array [0..200001] of longint;
  p,q:array [0..100001] of longint;
  c:array [0..100001] of boolean;
  f:array[0..100000,0..1] of longint;
  n,i,j,s:longint;

function min(a,b:longint):longint;
begin
      if b>a then exit(a);
      exit(b);
end;

procedure dg(dep:longint);
var
      i,x,y:longint;
begin
      x:=1;
      y:=0;
      for i:=p[dep] to q[dep] do
          begin
                if c[a[i]]=false then
                   begin
                         c[a[i]]:=true;
                         dg(a[i]);
                         x:=x+min(f[a[i],0],f[a[i],1]);
                   end;
                y:=y+f[a[i],1];
          end;
      f[dep,1]:=x;
      f[dep,0]:=y;
end;

begin
      readln(n);
      for i:=1 to n do
          begin
               read(s);
               p[i]:=q[i-1]+1;
               q[i]:=q[i-1]+s;
               for j:=p[i] to q[i] do read(a[j]);
               readln;
          end;
      c[1]:=true;
      dg(1);
      writeln(min(f[1,0],f[1,1]));
end.

你可能感兴趣的:(pascal,深搜dfs,动态规划)