任意點時間限制:c/c++ 1秒,其他語言2秒
空間限制:c/c++ 32768k,其他語言65536k
64bit io format: %lld
平面上有若干個點,從每個點出發,你可以往東南西北任意方向走,直到碰到另乙個點,然後才可以改變方向。
請問至少需要加多少個點,使得點對之間互相可以到達。
第一行乙個整數n表示點數( 1 <= n <= 100)。i第二行n行,每行兩個整數x
, yi
表示座標( 1 <= xi
, yi
<= 1000)。y軸正方向為北,x軸正方形為東。
輸出乙個整數表示最少需要加的點的數目。示例1
22 11 2
1
示例2
22 14 1
0這個就是乙個並查集求聯通快
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include7using
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 星球大戰 當我們加入乙個點時,先假設又加入乙個單獨的連通塊,然後再掃一下與它...