程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 2818 Building Block (並查集)

hdu 2818 Building Block (並查集)

編輯:C++入門知識

並查集每一個點的信息記錄的其實都是根節點的信息。

更新的時候不斷遞歸出根節點的信息,然後更新自己的信息就可以了。


#include 
#include 
#include 
#include 

using namespace std;

int set[30005],cnt[30005],num[30005];

int find(int x)
{
    if(x!=set[x]){
        int S=set[x];
        set[x]=find(set[x]);
        num[x]+=num[S];
    }
    return set[x];
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<=30000;i++)
        {
            num[i]=0;
            cnt[i]=1;
            set[i]=i;
        }

        while(n--)
        {
            int a,b;
            char op[5];
            scanf("%s",op);

            if(op[0]=='M')
            {
                scanf("%d%d",&a,&b);

                int x=find(a);
                int y=find(b);
                if(x==y)continue;
                set[x]=y;
                num[x]=cnt[y];
                cnt[y]+=cnt[x];
            }
            else
            {
                scanf("%d",&a);
                find(a);
                printf("%d\n",num[a]);
            }
        }
    }
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved