zoukankan      html  css  js  c++  java
  • [原]poj-1611-The Suspects(水并查集)

    题目链接:http://poj.org/problem?id=1611

    题意:输入n个人,m个组。初始化0为疑似病例。输入m个小组,每组中只要有一个疑似病例,整组人都是疑似病例。相同的成员可以在不同的组。找出一共有多少个疑似病例。

    解题思路:同组的同parent,查找,合并集合。最后将出现的每个组员的parent和0的parent相比较,统计便可。

    AC代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define ma 300010
    
    int fa[ma],m,n;
    int h[ma];
    int member[ma];
    int Count = 1;
    void init(int a)
    {
      for(int i = 0; i < a; i++)
      {
        fa[i] = i;
        h[i] = 0;
      }
      return;
    }
    
    int Find(int x)
    {
      if(fa[x] == x)
       return x;
      else
       return fa[x] = Find(fa[x]);
    }
    
    void unite(int x,int y)
    {
      x = Find(fa[x]);
      y = Find(fa[y]);
    
      if(x == y) return;
      else
      {
        if(h[x] > h[y]) fa[y] = fa[x];
        else
        {
          fa[x] = fa[y];
          if(h[x] == h[y]) h[y]++;
        }
      }
    }
    bool same(int x, int y)
    {
     return Find(x) == Find(y);
    }
    
    inline void solve(int n,int m)
    {
        init(n);
        while(m--)
        {
          int a;
          cin>>a;
          for(int i = 0; i < a; i++)
            cin>>member[i];
          //sort(member,member+a*sizeof(int));
          for(int i = 1; i < a; i++)
           unite(member[i-1],member[i]);
        }
        for(int i = 1; i < n; i++)
          if(same(0,i)) Count++;
        cout<<Count<<endl;
    
    }
    
    int main()
    {
      while(cin>>n>>m)
      {
        if(!n) break;
        solve(n,m);
        Count = 1;
      }
    
      return 0;
    }


    作者:u011652573 发表于2014-2-27 15:18:54 原文链接
    阅读:54 评论:0 查看评论
  • 相关阅读:
    c#多线程控制
    SQL解析XML文件
    c#时间差高精度检查
    SQL Server数据库级别触发器
    c#做对比软件
    项目管理开源软件
    信息量、信息熵、交叉熵、相对熵
    GAN评价指标之mode score
    Fréchet Inception Distance(FID)
    图片的多样性之模式崩溃
  • 原文地址:https://www.cnblogs.com/ZiningTang/p/3834761.html
Copyright © 2011-2022 走看看