並查集的應用2

梅津太郎發表於2019-03-24
//並查集
//樹的概念來理解,如果兩個點,他們的根節點相同,
//那麼他們在一個集合中。
#include<iostream>
using namespace std;

//n個小朋友,輸入是朋友的編號,朋友關係可以傳遞。輸出最大集合個數,集合內,任意兩個人都是朋友。

int tree[1000];
int sum[1000];//儲存根節點下子孫節點個數。

int findroot(int x)//尋根函式。
{
    if(tree[x]==-1) return x;
    else 
    {
        int temp=findroot(tree[x]);
        tree[x]=temp;
        return temp;
    }
}

int main()
{
    int n;
    cin>>n;//n個小朋友。
    
    for(int i=1;i<=n;i++)
    {
        tree[i]=-1;//初始化為根節點。
        sum[i]=1;
    }
    
    int a,b;
    for(int i=1;i<=n;i++)
    {
        cin>>a>>b;//ab互為朋友。
        a=findroot(a);
        b=findroot(b);
        if(a!=b)
           {root[a]=b;
            sum[b]+=sum[a];
            sum[a]=0;   
           } 
        
    }
    
    ans=0;
    for(int i=1;i<=n;i++)
    {
        if(tree[i]==-1&&ans<sum[i]) ans=sum[i];
        
    }
    
    cout<<ans;//輸出最大的聯通圖的節點數。
    
    
    return 0;
}

 

相關文章