您的位置:首页 > 其它

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

2017-04-02 16:42 204 查看
题目大意:

中山市有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..2
4000
00001] 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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: