dfs判断连通块个数
#include<bits/stdc++.h>
const int N=1005;
using namespace std;
vector<int> mp[N];
int vis[N]={0};
void dfs(int k){
for(int i=0;i<mp[k].size();i++)
if(vis[mp[k][i]]==0){
vis[mp[k][i]]=1;
dfs(mp[k][i]);
}
}
int main(){
int n,m;
cin>>n>>m;
int a,b;
for(int i=1;i<=m;i++){
cin>>a>>b;
mp[a].push_back(b);
mp[b].push_back(a);
}
int ans=0;
for(int i=1;i<=n;i++)
if(vis[i]==0){
vis[i]=1;
dfs(i);
ans++;
}
cout<<ans<<endl;
return 0;
}
并查集判断连通块个数
#include <bits/stdc++.h>
int p[10100];
void init(int N) {
for (int i = 1; i <= N; i++)
p[i] = i;
}
int findd(int x)
{
if (p[x] != x) p[x] = findd(p[x]);
return p[x];
}
void merge(int x, int y)
{
int fx = findd(x);
int fy = findd(y);
if (fx != fy)
p[fx] = fy;
}
int main() {
int n, m, i, x, y, cnt;
while (scanf("%d", &n), n) {
cnt = 0;
init(n);
scanf("%d", &m);
while (m--) {
scanf("%d%d", &x, &y);
merge(x, y);
}
for (i = 1; i <= n; i++) {
if (p[i] == i) cnt++;
}
printf("%d\n", cnt - 1);
}
}