帶權並查集 刪除 UVA11987

2021-07-16 17:52:47 字數 633 閱讀 3807

題意:

n個數字 m個操作

1:  x  y 合併 x,y

2: 將x元素移動到y元素所在的集合

3:  輸出x集合中元素個數,和總和

思路:刪除並查集: 並非把根節點或者子節點直接刪除,而是保留。

之後將刪除的元素放到陣列最後進行新一輪操作。

而原值所在的集合的權在刪除時進行更新就好

刪除並查集實現:既然要更新元素到當前陣列最後,就要記錄下id[x],下次才能直接進行

#include #include using namespace std;

int id[200010];

int father[200010];

int num[200010];

int sum[200010];

int cot;

int n,m;

void init(int n)

}int find(int x)

void del(int x)

void union(int x,int y)

}int main()

else if(op==2)

}else}}

return 0;

}

uva11987 帶刪除的並查集

題意 初始有n個集合,分別為 1 2 3 n。有三種操件 1 p q 合併元素p和q的集合 2 p q 把p元素移到q集合中 3 p 輸出p元素集合的個數及全部元素的和。題解 並查集。只是並查集中並沒有刪除的操作。所以就需要將刪除的這個點的影響降到0,也就是給刪除的點申請乙個新的id,以後都是用這個...

uva11987 並查集小技巧

大意 維護一種資料結構,支援 幾乎是常數級別的 集合合併 將乙個元素轉移到另乙個集合 詢問每個集合的和與元素個數。program p11987 var n,m,i,p,q,op,top longint f,c,pos,s array 0.500002 of longint function find...

並查集,帶權並查集

題意 ignatius過生日,客人來到,他想知道他需要準備多少張桌子。然而一張桌子上面只能坐上相互熟悉的人,其中熟悉可定義成為a與b認識,b與c認識,我們就說a,b,c相互熟悉 例如a與b熟悉and b與c熟悉,d與e熟悉,此時至少需要兩張桌子。輸入 t表示樣例個數,n表示朋友個數,朋友從1到n編號...