poj1611——The Suspects

题目大意:n个学生分成m组,如果一个学生感染了病毒,他同组的学生就都感染了,开始时0号学生已感染,问有多少人感染

输入:(可以有很多case,输入以0 0结束)

            第i个case的n  m( 0 < n <= 30000 ,0 <= m <= 500)

            第j组包含的人数k  每个学生的编号(空格分隔)

输出:第i个case的感染人数

分析:利用并查集(在同一个并查集中的点不能连线)。处理每个组时,从第二个学生开始,每个人都和第一个学生合并,最后循环n个人判断每个人是否在0为根的并查集中,并计数。

代码:转载自http://blog.csdn.net/lmfqyj/article/details/51357443

  1. #include<cstdio>   
  2. using namespace std;  
  3. int a[30001],pre[30001];  //a储存结点权值,pre储存父节点
  4. int find(int x)  
  5. {  
  6.      if(pre[x]==x)  
  7.         return x;  
  8.     else  
  9.         return pre[x]=find(pre[x]);  //返回x的根节点
  10. }  
  11. void mix(int x, int y)  
  12. {  
  13.     int fx = find(x), fy = find(y);  //找xy分别所在的根节点
  14.     if (fx != fy)  //不在同一并查集
  15.         pre[fy] = fx;  //合并(连线)
  16. }  
  17. int main()  
  18. {  
  19.     //freopen("C:\\in.txt","r",stdin);  
  20.     int n,m;  
  21.     while (scanf("%d%d", &n, &m) != EOF && (n || m))  
  22.     {  
  23.         int sum = 0;  
  24.         for (int i = 0; i < n; i++)  //初始化
  25.             pre[i] = i;  
  26.         for (int i = 0; i < m; i++)  
  27.         {  
  28.             int k;  
  29.             scanf("%d", &k);  
  30.             if (k >= 1)  
  31.             {  
  32.                 scanf("%d", &a[0]);  
  33.                 for (int j = 1; j < k; j++)  
  34.                 {  
  35.                     scanf("%d", &a[j]);  
  36.                     mix(a[0], a[j]);  
  37.                 }  
  38.             }  
  39.         }  
  40.         for (int i = 0; i < n; i++)  
  41.             if (find(i) ==pre[0])  
  42.                 sum++;  
  43.         printf("%d\n", sum);  
  44.     }  
  45.     return 0;  
  46. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值