做法:并查集
思路:并查集判联通,计算出总共有多少个独立的部分,答案为这些部分减一
用并查集做的话实在太简单了。什么?不会还有人不会并查集吧?
总之,思路如上,代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int fa[N],n,m,x,y;
int finds(int x){
return x==fa[x]?x:fa[x]=finds(fa[x]);//并查集查找根+路径压缩
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)fa[i]=i;//令人无语的初始化
for(int i=1;i<=m;i++){
cin>>x>>y;
int fax=finds(x),fay=finds(y);
if(fax!=fay)fa[fay]=fax;//直接无脑添加节点
}
int ans=0;
for(int i=1;i<=n;i++)
if(fa[i]==i)ans++;//根为自己,即独立的点
printf("%d\n",ans-1);
//点数为n的图(将联通的部分视作一个点)要想全部连接,最少需要n-1条边
return 0;
}
切莫直接抄袭