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;
    }
    
  • 相关阅读:
    c# 不常用逻辑运算符
    c# 简单日志记录类 log

    最短路径
    A+B
    floyd 算法
    Kruskal 算法
    快排
    顺序表的逆排
    顺序表中多余元素的删除
  • 原文地址:https://www.cnblogs.com/hpustudent/p/2115038.html
Copyright © 2011-2022 走看看