15808任意点

    科技2022-07-13  129

    题目描述:

    平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可以改变方向。 请问至少需要加多少个点,使得点对之间互相可以到达。

    输入描述:

    第一行一个整数n表示点数( 1 <= n <= 100)。 第二行n行,每行两个整数xi, yi表示坐标( 1 <= xi, yi <= 1000)。 y轴正方向为北,x轴正方形为东。

    输出描述:

    输出一个整数表示最少需要加的点的数目。

    输入

    2 2 1 1 2

    输出

    1

    输入

    2 2 1 4 1

    输出

    0 解题思路:简单的并查集。。。对于任意两个坐标如果存在横坐标相同或者纵坐标相同,就把这两个点归为同一个集合。。。。 判断集合的个数,需要增加的点数就是(点的总数-1);

     

    #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; int f[110]; struct node { int x; int y; }q[110]; int getf(int v) { if(f[v]==v) return v; else { f[v]=getf(f[v]); return f[v]; } } void merge(int x,int y) { int t1=getf(x); int t2=getf(y); if(t1!=t2) f[t2]=t1; } int main() { int n; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<=n;i++) scanf("%d%d",&q[i].x,&q[i].y); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(q[i].x==q[j].x||q[i].y==q[j].y) { merge(i,j); } } } int num=0; for(int i=1;i<=n;i++) { if(f[i]==i) num++; } printf("%d\n",num-1); } return 0; }

     

    Processed: 0.010, SQL: 8