美文网首页
活动分组——无向图的连通分量个数

活动分组——无向图的连通分量个数

作者: 四喜汤圆 | 来源:发表于2018-08-25 15:35 被阅读327次

一、相关概念

  1. 连通分量

无向图中,极大连通子图称为连通分量
1)连通图的连通分量只有一个,即自身
2)非连通的无向图有多个连通分量

  1. 强连通分量

有向图中,极大强连通子图称为强连通分量
1)强连通图的强连通分量只有一个,即自身
2)非强连通的有向图有多个强连通分量

二、题目

题目




思路

根据题意可得,只要两个节点A、B之间有联系(A认识B,或 B认识A,或A和B互相认识),则可把他们分到一组

用并查集 求解无向图中连通分量个数

代码

import java.util.Arrays;
import java.util.Scanner;

public class 连通子图个数 {

    public static void main(String[] args) {
        new 连通子图个数().exe();
    }

    private void exe() {
        Scanner scan = new Scanner(System.in);
        // 节点个数
        int n = scan.nextInt();
        /*
         * 建立并查集(节点下标从1开始)
         * 并查集中i==v[i]的:认为这个节点是一个树的根节点 
         */
        int[] v = new int[n + 1];
        /*
         * 初始化并查集,初始时认为每个节点都在独立的集合中(自成一棵树) 
         */
        for (int i = 0; i < n + 1; i++) {
            v[i] = i;
        }
        for (int i = 1; i <= n; i++) {
            int temp = -1;
            while ((temp = scan.nextInt()) != 0) {
                // 对于边[i][temp]
                // 节点i所在树的根节点
                int a=getRoot(v,i);
                // 节点temp所在树的根节点
                int b=getRoot(v,temp);
                if(a!=b){
                    // 不在同一集合里,那么把他们合并到一个集合(因为它们之间有关联)
                    v[a]=b;
                }
                // 在一个集合里,啥也不做
            }
        }
         System.out.println(Arrays.toString(v));
        int count = 0;
        for (int i = 1; i < n + 1; i++) {
            if (i == v[i]) {
                count++;
            }
        }
        System.out.println(count);
    }

    /**
     * 通过并查集v,查找节点i所在集合的根节点编号
     * @param v
     * @param i
     * @return
     */
    private int getRoot(int[] v, int i) {
        while(i!=v[i]){
            i=v[i];
        }
        return i;
    }

}


参考文献

并查集的应用之求解无向图中的连接分量个数
LeetCode Union-Find(并查集) 专题(一)
LeetCode_朋友圈个数

相关文章

  • 活动分组——无向图的连通分量个数

    一、相关概念 连通分量 无向图中,极大连通子图称为连通分量1)连通图的连通分量只有一个,即自身2)非连通的无向图有...

  • 图的连通性

    一、连通分量 1.1 定义 连通分量是针对无向图的,无向图G的极大连通子图称为G的连通分量( Connected ...

  • 数据结构与算法--图论之寻找连通分量、强连通分量

    数据结构与算法--图论之寻找连通分量、强连通分量 寻找无向图的连通分量 使用深度优先搜索可以很简单地找出一幅图的所...

  • 几个概念:有向图、无向图、加权图、简单图、联通、联通分量、生成树、强连通分量、强联通图图的存储:邻接矩阵(二维、一...

  • 无向图的连通分量

    ( 一 ) DFSDFS的时间复杂度是O(V + E ),理论上比并查集要优。但是它的缺点是需要对整个图进行预处理...

  • 算法与数据结构练习中常犯错误5——图论

    4.图论 4.1 无向图 4.1.1 DFS连通性与路径 51)少了index等检查 4.1.2 DFS连通分量 ...

  • 无向图的双连通分量

    双连通分量 点_双连通分量 BCC对于一个连通图,如果任意两点至少存在两条“点不重复”的路径,则说图是点双连通的(...

  • DFS——547. 朋友圈

    这道题之前没有看懂,后来明白了,是要通过关系找到互相连通的个数,即对无向图的邻接矩阵做dfs,来统计无向图的连通子...

  • 额外 - 杭电 - 畅通工程

    题目:畅通工程 本质:计算无向图的连通分量 输入:int N = 城镇数list input_list = 城镇...

  • BFS及其应用

    内容概要: BFS类的实现 BFS求解连通分量 BFS求解无向图点对之间的一条最短路径 BFS判定无环图和二分图 ...

网友评论

      本文标题:活动分组——无向图的连通分量个数

      本文链接:https://www.haomeiwen.com/subject/abzwiftx.html