题目链接
题目思路
都是通过用并查集来寻找是否各点是否关联,通过merge处理之后寻找是否fa[i]==i,从而确定有几个未关联的点集
代码实现
//任意点
#include<bits/stdc++.h>
using namespace std;
const int Max=1e5;
int n,sum=0;
int fa[Max];
struct node{
int x,y;
}a[Max];
void init()
{
for(int i=1;i<=n;i++)
fa[i]=i;
}
int find(int a)
{
if(fa[a]!=a)
{
fa[a]=find(fa[a]);
}
return fa[a];
}
void merge(int a,int b)
{
int faa=find(a),fab=find(b);
if(faa!=fab)
{
fa[faa]=fab;
}
}
int main()
{
cin>>n;
sum=0;
init();
for(int i=1;i<=n;i++)
cin>>a[i].x>>a[i].y;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
if(a[i].x==a[j].x||a[i].y==a[j].y)
merge(i,j);
for(int i=1;i<=n;i++)
if(fa[i]==i)
sum++;
cout<<sum-1<<endl;
return 0;
}//加边的无向图
#include<bits/stdc++.h>
using namespace std;
const int Max=1e5;
int n,m;
int ft[Max];
void init()
{
for(int i=1;i<=n;i++)
ft[i]=i;
}
int find(int x)
{
return ft[x]==x?x:ft[x]=find(ft[x]);
}
void merge(int x,int y)
{
int a=find(x),b=find(y);
ft[b]=a;
}
int main()
{
cin>>n>>m;
init();
int ii,jj,sum=0;
for(int i=1;i<=m;i++)
{
cin>>ii>>jj;
merge(ii,jj);
}
for(int i=1;i<=n;i++)
{
if(ft[i]==i)
{
sum++;
}
}
cout<<sum-1<<endl;
return 0;
}
京公网安备 11010502036488号