Determine the number of connected blocks

dfs to determine the number of connected blocks

#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;//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;
}

Check the number of connected blocks

#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)  //判断x,y是否在同一个连通块
        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);
    }
}

Guess you like

Origin blog.csdn.net/qq_47783181/article/details/112992308