並查集相關習題總結 上

2021-08-15 16:21:39 字數 2228 閱讀 5888

學習kruskal的時候我們學習了並查集,那時候都是不帶權值的。今天找了一些並查集的題目寫了下,寫題時也參考了大牛的部落格                                           

1.rank of tetris

**如下:

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn=10000+5;

const int inf = 1e9;

struct node

;} s[maxn];

vectorp[maxn];

int pre[maxn],in[maxn],sum,n;

void init()

else

}top_sort();

}}

帶權值,我們用num陣列記錄,然後將輸入的資料進行排序

**如下:

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn1=10000+5;

struct node

j++;

}ans[p[i].id]=sum;

}for(int i=1; i<=q; i++)

printf("%lld\n",ans[i]);

}return 0;

}

hdu 3172

水題!!!

**如下:

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn = 100000 +5 ;

int pre[maxn],num[maxn];

mapm;

void init()

cout<

hdu 3635

強力推薦這題  在我們更新根節點的時候,也要更新移動的次數

**如下:

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn = 10000 +5 ;

int pre[maxn],num[maxn],mov[maxn];

int find(int x)

return x;

}void join(int x,int y)

}void init(int n)

}int main()

else}}

}}

hdu 2473

刪除節點,

首先將0~n-1的根節點設為n~2n-1,將2n~2n+m-1作為備用節點。刪除操作時將x的根節點置為備用節點,然而實際上x的節點資訊之前已經對映到x+n中,那麼x+n的兄弟節點的根節點資訊依然保留了下來。詳細看這:

**如下:

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn = 1e5 +5 ;

const int maxm = 1e6 +5;

int pre[maxn*2+maxm];

int cot,n,m;

inline void init()

return 0;

}

並查集的題目還有一些還沒寫,比如poj的食物鏈。之後會也寫上

並查集習題

時間限制 150 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 布置宴席最微妙的事情,就是給前來參宴的各位賓客安排座位。無論如何,總不能把兩個死對頭排到同一張宴會桌旁!這個艱鉅任務現在就交給你,對任何一對客人,請編寫程式告訴主人他們是否能被安排同...

並查集 總結

自己學完後總結一下吧,並查集,我的理解就是乙個查詢與合併,用乙個find函式來查詢自己的祖先也就是根節點,在這過程中還可以進行路徑壓縮,就是讓這個點直接變到根節點之下,還有就是合併,找出這兩個點的根節點,如果根節點不相同的話,就將乙個根節點放到另乙個根節點下面。這道題的就是用並查集做,找出總共有幾個...

並查集總結

用自己的理解來寫好了 有些地方可能不對 不定時更新理解 操作主要為三步 一 初始化 void init 二 查詢 這個為路徑壓縮 就是每次查詢時更新 查詢節點 x 上面所有節點直接使他們連向根節點 每次查詢更新 int find int x 另一種路徑壓縮 不過麻煩了些 作為理解 int find ...