I and OI
Past...

题意:N组学生.一个学生能同时加入不同的组.同一组的学生会同时感染病毒.
现在0号的学生感染了病毒,问一共有多少个人感染病毒.

分析:并查集.将同一组的学生合并.这样有交集的组也被合并.最后只要求出

0号所在的集合大小即可.

code:

var   f:array[0..30000] of longint;
      n,m,i,j,k,u,v,fu,fv,fx,ans:longint;

      function getf(x:longint):longint;
      begin
            if f[x]<>x then f[x]:=getf(f[x]);
            exit(f[x]);
      end;


begin
      while not seekeof do
      begin
            readln(n,m);
            if n+m=0 then break;
            for i:=0 to n-1 do f[i]:=i;
            for i:=1 to m do
            begin
                  read(k);
                  read(u);
                  for j:=1 to k-1 do
                  begin
                        read(v);
                        fu:=getf(u);
                        fv:=getf(v);
                        if fu<>fv then f[fu]:=fv;
                  end;
            end;
            fx:=getf(0);
            ans:=0;
            for i:=0 to n-1 do
               if getf(i)=fx then inc(ans);
            writeln(ans);
      end;
end.
posted on 2011-08-10 15:41  exponent  阅读(228)  评论(0编辑  收藏  举报