zoukankan      html  css  js  c++  java
  • The Suspects(流感疑似病人)

    poj 1611

    题目大意:0号学生是流感疑似病人,找出与0接触及与0间接接触的人(与0接触的人接触的人)的个数

    解决:并查集,找出与0同在一个集合的所有元素的个数

    #include <iostream>
    #include <cstring>
    using namespace std;
    int num[30005];
    bool mark[30005];
    int find(int x)
    {
        if(num[x]<0)return x;
        return num[x]=find(num[x]);
    }
    void merge(int a,int b)
    {
         int fa=find(a);
         int fb=find(b);
         if(fa==fb)return;
         int t=num[fa]+num[fb];
         if(num[fa]>num[fb]){num[fa]=fb;num[fb]=t;}
         else {num[fb]=fa;num[fa]=t;}
    }
    int main()
    {
        int n,m;
        while(cin>>n>>m,n)
        {
            memset(num,-1,sizeof(num));
            memset(mark,false,sizeof(mark));
            int k,t,a;
            while(m--)
            {
                      cin>>k;
                      cin>>t;
                      mark[t]=true;;
                      while(--k)
                      {
                          cin>>a;
                          mark[a]=true;
                          merge(t,a);      
                      }
             }
             int count=1;
             int root0=find(0);//找出0所在的集合,因为0在所有集合中都是疑似病人
             for(int i=1;i<n;i++)//在所有学生中找出在集合某一个集合而且与0号接触或者间接接触的人
               if(mark[i] && find(i)==root0 )count++;
             cout<<count<<endl;             
        }
                     
     //   system("pause");
        return 0;
    }
    
  • 相关阅读:
    3.数据库分类
    2.Oracle数据库安装教程
    1.Oracle数据库简介
    MySQL最全存储引擎、索引使用及SQL优化的实践
    大数据各个工具随笔
    初入Shell
    第4章 DDL数据定义
    第3章 Hive数据类型
    第2章 Hive安装
    MySQL 创建数据库
  • 原文地址:https://www.cnblogs.com/hpustudent/p/2115038.html
Copyright © 2011-2022 走看看