[kuangbin帶你飛]專題五 並查集--poj1611(模板題)

The Suspects

vj地址
在這裏插入圖片描述

在這裏插入圖片描述

題意:

本題的感染者,肯定是有0的連通塊

思路:

先合併,之後再求出 find(0)----即找到0的祖先(0所在的連通塊)

  1. fa=find(0);
  2. 之後看fa這個連通快有多少個元素。

反思:

  1. 輸入小心啊,沒注意continue,3wa,qwq。
  2. 並查集就常規來,別瞎搞。qwq。

AC(模板)

#include <iostream>
#include <cstdio>
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
const int maxn=3e4+10;
int f[maxn];
int find(int x)
{
    if(x==f[x])return x;
    return f[x]=find(f[x]);
}
int main()
{
    int n,m;
    while(scanf("%d %d",&n,&m)&&(n|m))
    {
        For(i,0,n-1)f[i]=i;
       // cout<<"ok"<<endl;
      // cout<<"n="<<n<<endl;
       //cout<<"m="<<m<<endl;
        For(i,1,m)
        {
            int k,x,pre;
            scanf("%d",&k);
            scanf("%d", &pre);
            if(k==1)continue;
            For(j,2,k)
            {
                scanf("%d", &x);
                int A=find(pre),B=find(x);
                if(A!=B)f[B]=A;
            }
        }
        int fa=find(0),ans=0;
        For(i,0,n-1)
        {
            if(find(i)==fa)ans++;
           // cout<<f[i]<<" ";
        }
        //cout<<endl;
        printf("%d\n",ans);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章