求解无向图的连通分量个数方法

本文深入探讨了图算法中的两种关键方法:深度优先搜索(DFS)与并查集。DFS通过遍历图的每个节点来确定连通组件的数量,而并查集则通过维护一组节点集合,使得每次查询都能快速找到节点所属的集合,从而统计独立连通组件的数量。文章详细介绍了这两种算法的实现过程与核心思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:DFS

#define N 10000 //图中点的个数
int graph[N][N];// 0 表示没有边 1 表示有边
bool visited[N]={false};
void DFS(int root){
    visited[root]=true;
    for(int i=0;i<N;i++){
        if(visited[i]==false&&graph[root][i]!=0){
            DFS(i);
        }
    }
}

int count(int node){
    int cnt=0;
    for(int i=0;i<N;i++){
        if(visited[i]==false){
            DFS(i);
            cnt++;
        }
    }
    return cnt;
}

思路:一次深搜能访问一个节点所有能访问的边,统计有几次DFS就能表示有几个变量了。

2:并查集

#define N 10000 //图中点的个数
int father[N];
int findFather(int v){
    int m=v;
    while(v!=father[v]){
        v=father[v];
    }
    while(m!=father[m]){
        int temp=father[m];
        father[m]=v;
        m=temp;
    } 
}
void union(int a,int b){
    int Fa=findfather(a);
    int Fb=findfather(b);
    if(Fa!=Fb){
        father[Fa]=Fb;
    }
}
int cout(){
    int cnt=0;
    for(int i=0;i<N;i++){
        if(father[i]==i){
           cnt++;
        }
    }
    return cnt;
}

将能相互连通的点的集合赋予一个共同的父亲,统计父亲的个数就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值