链接:https://www.nowcoder.com/acm/contest/84/C
来源:牛客网
题目描述
平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可以改变方向。
请问至少需要加多少个点,使得点对之间互相可以到达。
请问至少需要加多少个点,使得点对之间互相可以到达。
输入描述:
第一行一个整数n表示点数( 1 <= n <= 100)。
第二行n行,每行两个整数xi,yi表示坐标 (1<=xi,yi<= 1000)。
y轴正方向为北,x轴正方形为东。
输出描述:
输出一个整数表示最少需要加的点的数目。
示例1
输入
2 2 1 1 2
输出
1
示例2
输入
2 2 1 4 1
输出
0
解题思路:100个点,规模很小,可以乱搞。 对于任意两个点,如果横坐标或者纵坐标相同,那么这两个点互相可达,加入一个集合,最后答案等于集合数-1(生成树思想)
#include<bits/stdc++.h> using namespace std; int x[110],y[110]; int f[1100]; int n; void init() { for(int i=0; i<=1000; i++) f[i] = i; } int Find(int a) { if(f[a] == a) return a; else return f[a] = Find(f[a]); } void unite(int a, int b) { int fa = Find(a); int fb = Find(b); if(fa != fb) f[fa] = fb; } int main() { while(~scanf("%d",&n)) { init(); for(int i=1; i<=n; i++) scanf("%d %d",&x[i],&y[i]); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(x[i] == x[j] || y[i] == y[j]) unite(i,j); int ans = 0; for(int i=1; i<=n; i++) { if(f[i] == i) ans++; } printf("%d ",ans-1); } return 0; }