題目鏈結
題目描述是中文,不再多說
本題目主要是採用帶權並查集的方法去記錄權值,用三個陣列實現
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...