帶權並查集(銀河英雄傳說)

2021-09-26 04:57:27 字數 890 閱讀 5744

題目鏈結

題目描述是中文,不再多說

本題目主要是採用帶權並查集的方法去記錄權值,用三個陣列實現

root 陣列儲存根節點

size 陣列儲存當前根節點的最大長度

d 陣列儲存當前位置到根節點的距離

在查詢的 a 到 b 的時候,如果 a ,b 在同乙個集合,輸出 a ,b 到根節點的距離的差的絕對值減一即可,如果不在同一集合輸出-1

在合併的時候,因為題目說明了將 b 放到 a 後面,也就是說我們需要將 b 掛到 a 後面,也就是說要以 a 為根,更新過後,兩個不相交的集合合併了,那麼該集合的根節點 a 對應的最大長度就是 size[ a ] + size[ b ] ,既然是把 b 掛到 a 上面,a 到根節點的距離不變,b 到根節點的距離就是原來的 size[ a ],即 d[ b ] = size[ a ]

在 find 的函式的路徑壓縮過程中,·對於沒被壓縮的節點而言,d[a]應該是從它的根節點傳遞過來的,所以是d[a]  = d[a] + d[root[a]]

**如下

#include #include #include #include using namespace std;

int n;

const int maxn = 30010;

int root[maxn], size[maxn], d[maxn];

int find(int a)

void mer(int a, int b)

}int main()

scanf("%d", &n);

getchar();

while (n--)

else

else puts("-1");

} }return 0;

}

並查集 銀河英雄傳說

description 公元五八 一年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集團在巴公尺利恩星域爆發戰爭。泰山壓頂集團派宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集團點名將楊威利組織麾下三萬...

並查集 銀河英雄傳說

2002年noi全國競賽 時間限制 1 s 空間限制 256000 kb 題目等級 大師 master 公元五八 一年,地球居民遷移至金牛座 第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙歷元年,並開始向銀河系深處拓展。宇宙歷七九九年,銀河系的兩大軍事集 在巴公尺利恩星域爆發戰爭。泰山壓頂集 ...

NOI 2002 銀河英雄傳說(帶權並查集)

小聲bb 我覺得帶權並查集比較玄妙 傳送門qaq 很容易想到用並查集來維護 設size表示當前佇列的數量 以i為隊頭的數量 to root表示當前節點到祖宗的距離 則對於每乙個飛船,它到隊頭的距離,就等於它到它祖先的距離加上它祖先到隊頭的距離,而它的祖先到隊頭的距離,也可以變成類似的。可以在getf...