題意:
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編號...