链接:https://ac.nowcoder.com/acm/problem/14685
来源:牛客网
给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~
输入描述:
第一行两个正整数 n 和 m 。
接下来的m行中,每行两个正整数 i 、 j ,表示点i与点j之间有一条无向道路。
输出描述:
输出一个整数,表示答案
示例1
输入
4 2
1 2
3 4
输出
1
备注:
对于100%的数据,有n,m<=100000。
#include<iostream>
#include<cstring>
#include<set>
using namespace std;
#define close_stdin ios::sync_with_stdio(false)
int fa[100009];
set<int>st;
int find(int x)
{
return x==fa[x]?x:fa[x]=(find(fa[x]));
}
void merge(int x,int y)
{
fa[find(x)]=find(y);
}
int main()
{
close_stdin;//只是为了让cin和printf一样快
int n,m;
cin>>n>>m;
int x,y;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=0;i<m;i++)
{
cin>>x>>y;
merge(x,y);
}
for(int i=1;i<=n;i++)
{
st.insert(find(i));
}
cout<<st.size()-1;
return 0;
}