题目链接
题意
给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~
思路
- 并查集,判断n个点有多少个集合,集合数减一为答案
参考代码
#include<bits/stdc++.h>
using namespace std;
int aa[100100];
int find1(int x)
{
if(aa[x]==x)return x;
aa[x]=find1(aa[x]);
return aa[x];
}
void add(int x,int y)
{
int tmp1=find1(x);
int tmp2=find1(y);
aa[tmp2]=tmp1;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
aa[i]=i;
}
int tmp1,tmp2;
for(int i=0;i<m;i++)
{
cin>>tmp1>>tmp2;
add(tmp1,tmp2);
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(aa[i]==i)ans++;
}
cout<<ans-1<<endl;
}