高中1029

来源:互联网 发布:mysql linux安装后在哪 编辑:程序博客网 时间:2024/04/18 23:17

Description

中山市石一个环境优美、气候宜人的小城市。因为城市的交通并不繁忙,市内的道路网很稀疏。准确地说,中山市有N条马路和N个路口,每条马路连接两个路口,每两个路口之间最多只有一条马路。作为一条交通网络,显然每两个路口之间都是可达的。为了更好地管理中山市的交通,市长决定在一些路口加装电子眼,用来随时监视路面情况。这些装在路口的电子眼能够监视所有连接到这个路口的马路。现在市长想知道最少需要在多少个路口安装电子眼才能监视所有的马路。市长已经把所有的路口都编上了1~N的号码。 给你中山市的地图,你能帮忙吗?

Input

输入文件第1行包括一个数字N(1<=N<=100000),表示中山市的路口数。接下来N行,第i+1行的第一个数字ki表示有ki条马路与路口i相连,后面紧跟着ki个数字,表示与路口i直接相连的路口。

Output

输出最少需要安装电子眼的数量。

Sample Input

32 2 32 1 32 1 2

Sample Output

2

Data Constraint

1<=N<=10000uses math;
var
        a,b,c,d,e,ans,ans1,last,last1:longint;
        v:array[1..100000,0..20]of longint;
        p:array[1..100000]of boolean;
        f:array[1..100000,1..2]of longint;
        pd:boolean;
procedure pp(last1:longint);
var
        i:longint;
begin
        p[last1]:=false;
        f[last1,1]:=1;
        for i:=1 to v[last1,0] do
        begin
                if v[last1,i]=-maxlongint then
                begin
                        continue;
                end;
                if p[v[last1,i]]=true then
                begin
                        pp(v[last1,i]);
                        f[last1,1]:=f[last1,1]+min(f[v[last1,i],2],f[v[last1,i],1]);
                        if last<>last1 then
                                f[last1,2]:=f[last1,2]+f[v[last1,i],1];
                end;
        end;
end;
procedure ss(l,last2:longint);
var
        i:longint;
begin
        pd:=false;
        p[l]:=true;
        for i:=1 to v[l,0] do
        begin
                if v[l,i]=-maxlongint then
                        continue;
                if v[l,i]=last2 then
                begin
                        continue;
                end;
                if p[v[l,i]]=true then
                begin
                        last:=v[l,i];
                        last1:=l;
                        pd:=true;
                        v[l,i]:=-maxlongint;
                        exit;
                end;
                ss(v[l,i],l);
                if pd=true then
                        exit;
        end;
end;
begin
        readln(a);
        for b:=1 to 100000 do
        begin
                for c:=0 to 20 do
                begin
                        v[b,c]:=-maxlongint;
                end;
        end;
        for b:=1 to a do
        begin
                read(v[b,0]);
                for d:=1 to v[b,0] do
                begin
                        read(v[b,d]);
                end;
                readln;
        end;
        ss(1,0);
        for b:=1 to v[last,0] do
        begin
                if v[last,b]=last1 then
                begin
                        v[last,b]:=-maxlongint;
                        break;
                end;
        end;
        fillchar(p,sizeof(p),true);
        pp(last);
        writeln(f[last,1]);
end.

0


0 0
原创粉丝点击