並查集的簡單應用

西琳的奇妙冒險發表於2018-04-26

題目:找出犯罪團伙數目

    第一行輸入n,m,n表示強盜的人數,m表示有m條線索,(線索中包含強盜的同夥資訊)

參見樣例輸入第二行,1 2表示1號強盜和2號強盜是同夥

樣例輸入:

10 9
1 2
3 4
5 2
4 6
2 6
8 7
9 7
1 6
2 4

樣例輸出:

3

程式碼實現:

#include<bits/stdc++.h>
using namespace std;

int father[100005]={0};
//查
int findd(int x)
{
    if(x == father[x]) return x;
    else father[x] = findd(father[x]);
    return father[x];
}
//並
void join(int x,int y)
{
    int fx = findd(x);
    int fy = findd(y);
    if(fx != fy) father[fy] = fx;
}
int main()
{
    int n,m,a,b;
    scanf("%d%d",&n,&m);
    //初始化
    for(int i = 0;i <n;i++)
    {
        father[i] = i;
    }
    for(int i= 0 ;i<m;i++)
    {
        scanf("%d%d",&a,&b);
        join(a,b);
    }
    int cnt=0;
    for(int i=0;i< n;i++)
    {
        if(i == father[i]) cnt++;
    }

    cout<<cnt<<endl;
}

 

相關文章