链接: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<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int find(int x){
return a[x]==x?x:a[x]=find(a[x]);
}
void merge(int x,int y){
a[find(x)]=find(y);
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
a[i]=i;
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
merge(x,y);
}
set<int>st;
for(int i=1;i<=n;i++){
st.insert(find(i));
}
cout<<st.size()-1<<endl;
return 0;
}