树型dp.......
设状态我们考虑两点:
1:尽量不与父节点相关;
2:保证所有的路要被了望到。
先考虑第二点,已知一条路有两个节点,如果其中一个节点不选,另一个节点必须选!所以想到选和不选的情况;设出f[t,0]和f[t,1],易列出方程;
g[gen,0]:=g[gen,0]+g[f[k,1],1];
g[gen,1]:=g[gen,1]+min(g[f[k,1],1],g[f[k,1],0]);
那么第一点手到擒来!AC!
标程(请勿抄袭):
var
g:array[0..100000,0..1] of longint;
f:array[0..100000,1..2] of longint;
q:array[0..100000] of longint;
i,j,k,m,n,o,p,l,s,t,x,y,gen:longint;
procedure insert(x,y:longint);
begin
inc(t);
f[t,1]:=y;
f[t,2]:=q[x];
q[x]:=t;
end;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
procedure dg(gen:longint);
var
k:longint;
begin
k:=q[gen];
while k<>0 do begin
dg(f[k,1]);
g[gen,0]:=g[gen,0]+g[f[k,1],1];
g[gen,1]:=g[gen,1]+min(g[f[k,1],1],g[f[k,1],0]);
k:=f[k,2];
end;
inc(g[gen,1]);
end;
begin
readln(n);
for i:=1 to n do begin
read(x);
if i=1 then gen:=x;
read(s);
for j:=1 to s do begin
read(y);
insert(x,y);
end;
end;
dg(gen);
writeln(min(g[gen,0],g[gen,1]));
end.