题意很简单,对x和y方向排序各并查集一遍之后看下分了几块就是答案
#include<bits/stdc++.h>
using namespace std;
int fa[10010];
struct node1
{
int c,x;
}data1[10010];
struct node2
{
int c,y;
}data2[10010];
bool cmpx(node1 l,node1 r)
{
return l.x<r.x;
}
bool cmpy(node2 l,node2 r)
{
return l.y<r.y;
}
int Find(int x)
{
return x == fa[x] ? x : fa[x] = Find(fa[x]);
}
int main()
{
int T ; scanf ( "%d" , &T );
while ( T-- )
{
int n,k; scanf ( "%d%d" , &n , &k );
for ( int i=1 ; i<=n ; i++ ) fa[i] = i;
for ( int i=1 ; i<=n ; i++ )
{
scanf ( "%d" , &data1[i].x );
scanf ( "%d" , &data2[i].y );
data1[i].c = data2[i].c = i;
}
sort ( data1+1 , data1+n+1,cmpx );
sort ( data2+1 , data2+n+1,cmpy );
for ( int i=1 ; i<n ; i++ )
{
if ( data1[i+1].x-data1[i].x<=k )
{
int fx = Find( data1[i].c );
int fy = Find( data1[i+1].c );
if ( fx!=fy )
fa[fy] = fx;
}
if ( data2[i+1].y-data2[i].y<=k )
{
int fx = Find( data2[i].c );
int fy = Find( data2[i+1].c );
if ( fx!=fy )
fa[fy] = fx;
}
}
int ans = 0;
for ( int i=1 ; i<=n ; i++ )
if ( i==Find(i) ) ans++;
cout<<ans<<endl;
}
return 0;
}