這題真的很經典,我wa了三次,最後一次才ac……
因為這道題是很有技術含量的,能自己寫出來真的很厲害(不是在誇自己)。如果只是粗略的去看題解或者抄題解(倒是可以用來矇騙自己),那這道題就失去意義了。下面的**,每一句話,都是值得深刻推敲的。
舉幾個例子:
int find(intx)
這裡就不能直接寫par [ x ] = find ( par [ x ] ),後面寫return par [ x ] 。(為什麼想過麼?)
而且粗略地想:深度不應該是父親 + 1 嗎?而且每一次都把深度加一遍,不會有錯嗎?
如果你這麼想,那麼首先你並沒有掌握並查集的本質和基礎的定義,需要再踏踏實實搞好基礎;如果你根本就沒想到這一點,而是直接欺騙自己感性地理解,那麼你只是背了乙個最普通的板子,並且和沒學過沒有區別,不可能獨立敲出這道題。
而這只是一部分,要不我也不會說這道題經典……
太晚了,不解釋為什麼了,如果你感興趣,可以來窗邊第一號機位。
**貼上:(可能沒有題解寫得好)
#include#include#include
using
namespace
std;
#define maxn 3000005
intn,dp[maxn],par[maxn],am[maxn];
int find(int
x)void merge(int x,int
y)int
main()
else
printf(
"%d\n
",abs(dp[y]-dp[x])-1
); }
}}
洛谷P1196 銀河英雄傳說
大意 你有30000個佇列,第i個佇列中只有i 有t個操作,1,把某個佇列頭接到另乙個佇列尾。2,問兩個元素之間的距離。本題主要有三種解法。帶權並查集。具體來說就是,並查集維護當前集合的大小,這個點距離代表元 隊首 的邊數。然後把合併和路徑壓縮魔改一下。詢問的時候就直接取距離之差。1 include...
洛谷 P1196 銀河英雄傳說
p1196 銀河英雄傳說 加權並查集,簡介見加權並查集,具體方法見 及注釋 p1196 銀河英雄傳說 includeint fa 30010 int r 30010 r i 表示第i號戰艦在其父親之後的第r i 個位置 int r2 30010 r2 i 表示以第i號戰艦為隊首的佇列有r2 i 輛戰...
洛谷P1196 銀河英雄傳說
題目大意 有30000個船,第i個船在第i列,兩個操作,m 把第i列的船整體拼到第j列船後,c 求第i和第j個船之間的船的個數 題解 可以想到用並查集,在基礎的並查集上增加路徑,用num陣列存第i個船到隊首的距離,用len存這一列的船的個數。問題主要在路徑壓縮上維護num陣列上。可以在find的過程...