任意點 並查集求聯通塊

2022-05-01 07:15:13 字數 1332 閱讀 7907

任意點時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32768k,其他語言65536k

64bit io format: %lld

平面上有若干個點,從每個點出發,你可以往東南西北任意方向走,直到碰到另乙個點,然後才可以改變方向。

請問至少需要加多少個點,使得點對之間互相可以到達。

第一行乙個整數n表示點數( 1 <= n <= 100)。

第二行n行,每行兩個整數x

i
, y
i
表示座標( 1 <= x
i
, y
i
<= 1000)。

y軸正方向為北,x軸正方形為東。

輸出乙個整數表示最少需要加的點的數目。
示例1

2

2 11 2

1

示例2

2

2 14 1

0

這個就是乙個並查集求聯通快

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 

7using

namespace

std;

8const

int maxn = 1e4 + 10;9

10 typedef long

long

ll ;

11int

fa[maxn], x[maxn], y[maxn];

1213

void init(int

n) 17}18

int find(int

p) 22

int find_set(int

p)23

2728

void combine(int p, int

q) 33

34int

main()

42for (int i = 1 ; i < n ; i++)

43for (int j = i + 1 ; j <= n ; j++)

44if (x[i] == x[j] || y[i] ==y[j] ) combine(i, j);

45int ans = 0;46

for (int i = 1 ; i <= n ; i++)

47if (fa[i] == i) ans++;

48 printf("

%d\n

", ans - 1

);49}50

return0;

51 }

任意點 並查集

傳送門 方法就是在同一行的是乙個集合,在同一列的也是乙個集合,先存再乙個乙個列舉即可。這裡主要就是要注意,當所有的點都已經全部連線完畢之後,編號為i的點的祖先並不是fa i 而是fin i 因為最後還要進行一次預處理,將所有的點都重新整合一遍 防止出現類似於,1,2,3,4,5是乙個集合,那麼可能f...

並查集求聯通塊個數 洛谷P1197

傳送門 並查集求聯通塊個數。這個題是每摧毀乙個點求一次聯通塊的個數,並查集不容易維護這種摧毀更新的,相反的,並查集可以很好的維護每安裝乙個點更新一次這種問題。摧毀和安裝是對立的,既然按順序摧毀,我們就逆序安裝。首先要算出沒安裝前 也就是摧毀之後 的聯通塊的個數。怎麼求呢,我們在記錄圖的邊的時候記錄一...

求連通塊(並查集實現)

連通塊可以理解為無向圖中有幾個連通的點集,那麼這個過程與並查集的原理就極其相似了,將點集看作並查集的祖先和他的後代們,相互連通的點就放在同一祖先下,這樣只需要查詢共有幾個祖先即可。下面來一道例題深入理解下 jsoi2008 星球大戰 當我們加入乙個點時,先假設又加入乙個單獨的連通塊,然後再掃一下與它...