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;
}