并查集,相关请看这模板
对于一个有 k个点的图 G ,如果想要让它连通,那么需要且仅需在 k 个点间连 k−1 条边(无重边)。
更进一步说,无论连边的顺序如何,在 k 个点间连 k−1 条边(无重边)能够让 G连通。
那么我们一边读入边一边用并查集维护连通关系就行了
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int f[N];
int find(int x){
if(f[x]!=x)f[x]=find(f[x]);//查找+路径压缩,如果没有祖先就回溯
return f[x];
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
f[i]=i;
}
int res=0;
while(m--){
int u,v;
cin>>u>>v;
if(find(u)==find(v)){
res++;
}
else{
f[find(u)]=find(v);
}
}
printf("%d\n",res);
return 0;
}