给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~
输入描述:
第一行两个正整数 n 和 m 。
接下来的m行中,每行两个正整数 i 、 j ,表示点i与点j之间有一条无向道路。
输出描述:
输出一个整数,表示答案
示例1
输入
4 2
1 2
3 4
输出
1
备注:
对于100%的数据,有n,m<=100000。
#include<cstdio>
int n,m,i,x,y,ans,f[1000000];
int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)f[i]=i;
ans=n-1;
while(m--)
{
scanf("%d%d",&x,&y);
if(F(x)!=F(y))ans--,f[f[x]]=f[y];
}
printf("%d",ans);
return 0;
}