POJ1611

本文介绍了一种使用并查集数据结构解决学生间病毒传播问题的方法。在一个包含多个学生组的问题场景中,一旦0号学生感染病毒,通过并查集合并同一组内成员,可以高效地计算出最终感染病毒的学生总数。

题意: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.

转载于:https://www.cnblogs.com/exponent/archive/2011/08/10/2133752.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值