并查集大法🦐
2026-09-06 16:28:13
发布于:广东
8阅读
0回复
0点赞
这道题可用深度优先搜索做
为啥不用深搜做呢🤔,谁叫我不会呢
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e5+1000;
ll n,m,fa[N],f1,f2;
ll to[N],cnt;
ll find(ll x){//查找自己的祖先
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)fa[i]=i;//初始化
for(int i=1;i<=m;i++){
ll u,v;//进行合并
cin>>u>>v;
f1=find(u);f2=find(v);
fa[f1]=fa[f2];
}for(int i=1;i<=n;i++){
f1=find(i);
if(!to[f1])cnt++;//查找是否在同一集合,如不统一就累加
to[f1]=1;
}cout<<cnt-1;//cnt代表把连一起的进行缩点,根据树可知n个点至少需要n-1条边
return 0;
}
这里空空如也







有帮助,赞一个