Ice Skating
題面翻譯
Description
給出n個點的橫縱坐標,兩個點互通當且僅當兩個點有相同的橫坐標或縱坐標,問最少需要加幾個點才能使得所有點都兩兩互通
Input
第一行一個整數n表示點數,之后n行每行兩個整數x[ i ]和y[ i ]表示第i個點的橫縱坐標(1<=n<=100,1<=x[ i ],y[ i ]<=1000)
Output
輸出需要加的最少點數
題目描述
Bajtek is learning to skate on ice. He’s a beginner, so his only mode of transportation is pushing off from a snow drift to the north, east, south or west and sliding until he lands in another snow drift. He has noticed that in this way it’s impossible to get from some snow drifts to some other by any sequence of moves. He now wants to heap up some additional snow drifts, so that he can get from any snow drift to any other one. He asked you to find the minimal number of snow drifts that need to be created.
We assume that Bajtek can only heap up snow drifts at integer coordinates.
輸入格式
The first line of input contains a single integer $ n $ ( $ 1<=n<=100 $ ) — the number of snow drifts. Each of the following $ n $ lines contains two integers $ x_{i} $ and $ y_{i} $ ( $ 1<=x_{i},y_{i}<=1000 $ ) — the coordinates of the $ i $ -th snow drift.
Note that the north direction coinсides with the direction of $ Oy $ axis, so the east direction coinсides with the direction of the $ Ox $ axis. All snow drift’s locations are distinct.
輸出格式
Output the minimal number of snow drifts that need to be created in order for Bajtek to be able to reach any snow drift from any other one.
樣例 #1
樣例輸入 #1
2
2 1
1 2
樣例輸出 #1
1
樣例 #2
樣例輸入 #2
2
2 1
4 1
樣例輸出 #2
0
使用并查集求解。
首先應明確,在這道題中,想要連接任意兩堆雪,只需要增加一堆雪就可以。
然后我們想在想要知道應該增加幾堆雪,就只需要知道有幾堆雪沒有連接起來,沒有連接的雪的數量減一就是需要增加的雪堆的數量。
那么只需要枚舉所有的點,然后使用并查集合并上所有能夠在同一個橫軸或者縱軸的點,最后求解出來連通塊的數量,就能夠得到沒有連通的數量。
CODE:
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
#define pii pair<int,int>
#define x first
#define y secondint p[N];
int n;
pii a[N];int find(int x){if(x != p[x])p[x] = find(p[x]);return p[x];
}int main(){cin >> n;for(int i = 1;i <= n;i++)cin >> a[i].x >> a[i].y;for(int i = 0;i < N;i++)p[i] = i;for(int i = 1;i <= n;i++){for(int j = i + 1;j <= n;j++){if(a[i].x == a[j].x || a[i].y == a[j].y){p[find(i)] = find(j);}}}int cnt = 0;for(int i = 1;i <= n;i++)if(p[i] == i)cnt++;cout << cnt - 1 << endl;return 0;
}