hdu2473之並查集

2021-06-13 19:27:15 字數 681 閱讀 9998

思路:每次刪除乙個點a,並不把a從當前集合刪除,而是用乙個陣列node[a]代表a對應的點,所以每次刪除a後,node[a]=++n,即開闢乙個新的點作為a對應的點,這樣就不會影響a這個集合

#include#include#include#include#include#include#include#include#include#define inf 99999999

using namespace std;

const int max=100000+10;

int father[max+max*10],rank[max+max*10],node[max],sum;

void makeset(int num)

}int findset(int v)

void union(int x,int y)

else

--sum;

}bool delete(int x)

return false;

} int main(){

int n,m,a,b,num=0;

char s;

while(scanf("%d%d",&n,&m),n+m){

makeset(n+m);

for(int i=0;i<=n;++i)node[i]=i;

sum=n;

for(int i=0;i

hdu 2473並查集 節點對映

這道題是到好題,要想做出這道題,得學會節點對映。因為題目中講了,有合併,還有刪除,那刪除乙個節點後,其他的節點關係依舊,但是這個被刪除的節點就得孤立,而且被孤立之後可能重新回到某個集合中,那如何處理呢?就是對映,比如1到n 現在要合併的是4 和 5 號節點,我們合併的並不是 4 和 5 而是 uni...

HDU3938 並查集 並查集

先按邊權值排個序,每次加入一條邊,用並查集,關鍵看懂題。include include include include using namespace std const int maxn 10010 int n,m,q struct edge edges maxn 5 inline int cmp...

hdu3635之並查集

include include include include include include include include include include define inf 99999999 using namespace std const int max 10000 10 father ...