算法7-5:连接部件

同学们一定用过Windows中的画图吧。那么画图中的油漆桶功能是如何实现的呢?

这个问题可以通过DFS深度优先搜索解决。

目标

我们要实现的目标是在常数的时间内判断某两个节点是否连接。

前面章节中介绍了并查集算法,并查集确实可以解决这个问题。我们今天来介绍另外一种办法,那就是DFS深搜。

为了解决这个问题专门建立一个对象,对象的轮廓如下:

public class ConnectedComponnent {
    public ConnectedComponnent(Graph G) {
    }

    // 判断两个顶点是否连接
    public boolean connected(int v, int w) {
    }

    // 连接部件的个数
    public int count() {
    }

    // 顶点所在的连接部件的编号
    public int id(int v) {
    }
}

数学定义

判断两个顶点是否连接在离散数学中是等价关系,它具有:

反射性:v和v是连接的

对称性:如果v和w是连接的,那么w和v也是连接的

传递性:如果v和w是连接的,w和z是连接的,那么v和z也是连接的

连接部件的定义:相互连接的顶点最大集合。

问题解决

为了解决上述的问题,首先要对图进行预处理。预处理的目标就是区分图中的连接部件。

区分连接部件的步骤如下:

  1. 将所有的顶点都标记为未访问
  2. 对于每个未访问的顶点,使用DFS标记部件编号

代码

public class ConnectedComponnent {
    private boolean[] visited;
    private int[] id;
    private int count;

    public ConnectedComponnent(Graph G) {
        visited = new boolean[G.V()];
        id = new int[G.V()];
        cc(G);
    }

    // 判断两个顶点是否连接
    public boolean connected(int v, int w) {
        return id[v] == id[w];
    }

    // 连接部件的个数
    public int count() {
        return count;
    }

    // 顶点所在的连接部件的编号
    public int id(int v) {
        return id[v];
    }

    private void cc(Graph G) {
        for (int i = 0; i < G.V(); i++) {
            if (!visited[i]) {
                dfs(G, i);
                count++; // 注意:这句话不能放在if之外。不然count总是等于顶点数量
            }
        }
    }

    private void dfs(Graph G, int v) {
        visited[v] = true;
        id[v] = count;
        for (int w : G.adj(v)) {
            if(!visited[w]) {
                dfs(G, w);
            }
        }
    }
}

应用

下图是某高校的人际关系图。如果把人际关系看成一张图,那么这里面就可以很清楚地看到有大大小小的连接部件。

探测星空图中的星星数量。

算法7-5:连接部件,布布扣,bubuko.com

时间: 2024-10-09 19:59:51

算法7-5:连接部件的相关文章

算法7-11:强连接部件

首先介绍什么是强连接.顶点之间的强连接就是如果v能到达w,那么w也能到达v.顶点之间的强连接就表示顶点之间可以双向到达,也就是说两个顶点在一个回路上. 介绍了强连接,那什么是强连接部件呢?强连接部件就是能够相互到达的所有顶点的集合.一个图中可能会有多个强连接. 强连接在离散数学中属于等价关系,也就是说它具有反射性,相反性,传递性. 应用 强连接在生物学中有所应用,食物链就是一个例子.下图展示了一个很小的食物链. 在食物链中,强连接部件表示在同一个部件中的生物共享相同的能量流. 强连接部件在软件工

ACM 算法实现

实验一 统计数字问题 1.问题描述:一本书的页码从自然数1 开始顺序编码直到自然数n.书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0.例如,第6 页用数字6 表示,而不是06 或006 等.数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9.2.题目分析:考虑由0,1,2,…,9组成的所有n位数.从n个0到n个9共有个n位数,在这些n位数中,0,1,2,…,9每个数字使用次数相同,设为. 满足如下递归式:由此可知,.据此,可从低位向高位进行

普林斯顿公开课 算法1-7:并查集基本概念

本节讲的是并查集的基本概念. 算法的开发步骤 对问题进行数学建模 寻找一个能够解决问题的算法 运行算法检测速度和内存是否符合要求 如果达不到要求,找出原因 寻找一种方法来解决问题 循环步骤,直到满意为止 以上就是算法开发比较科学的方法.算法开发完成之后需要进行数学分析. 并查集问题 给定N个物体,可以提供两种操作,一种是合并操作,一种是查找操作.合并操作就是将两个节点进行连接,查找操作就是判断两个节点是否连接在一起. 应用中的物体类型 实际应用中,并查集算法可以支持各种各样的物体类型,比如: 图

算法7-11:强连通分量

首先介绍的是一个强大的连接.顶点之间的紧密联系是假设v达到w,然后,w你可以达到v.顶点之间的强连接就表示顶点之间能够双向到达,也就是说两个顶点在一个回路上. 介绍了强连接.那什么是强连接部件呢?强连接部件就是可以相互到达的全部顶点的集合.一个图中可能会有多个强连接. 强连接在离散数学中属于等价关系,也就是说它具有反射性,相反性.传递性. 应用 强连接在生物学中有所应用.食物链就是一个样例.下图展示了一个非常小的食物链. 在食物链中,强连接部件表示在同一个部件中的生物共享同样的能量流. 强连接部

算法7-1:图论简介

无向图 无向图由顶点和边组成,边用于连接两个顶点.下面这张地图就是无向图的一个例子. OPTE工程 OPTE工程的目标就是绘制整个互联网的样子.下图是2010年的互联网.互联网也是无向图的一个例子.这张图是用LGL软件进行绘制的.有兴趣的同学可以研究一下:http://www.opte.org/ 术语 在图论中,有些术语是必须要知道的,不然没办法学习. 顶点:图中最基本的元素 边:连接两个顶点的线就是边 路径:由一个顶点到另一个顶点所经过的边 环:从一个顶点出发,经过一些边,最后到达原先的顶点,

挑战目标跟踪算法极限,SiamRPN系列算法解读

商汤科技智能视频团队首次开源其目标跟踪研究平台 PySOT.PySOT 包含了商汤科技 SiamRPN 系列算法,以及刚被 CVPR2019 收录为 Oral 的 SiamRPN++.此篇文章将解读目标跟踪最强算法 SiamRPN 系列. 背景 由于存在遮挡.光照变化.尺度变化等一些列问题,单目标跟踪的实际落地应用一直都存在较大的挑战.过去两年中,商汤智能视频团队在孪生网络上做了一系列工作,包括将检测引入跟踪后实现第一个高性能孪生网络跟踪算法的 SiamRPN(CVPR 18),更好地利用训练数

Apriori算法--关联规则挖掘

我的数据挖掘算法代码:https://github.com/linyiqun/DataMiningAlgorithm 介绍 Apriori算法是一个经典的数据挖掘算法,Apriori的单词的意思是"先验的",说明这个算法是具有先验性质的,就是说要通过上一次的结果推导出下一次的结果,这个如何体现将会在下面的分析中会慢慢的体现出来.Apriori算法的用处是挖掘频繁项集的,频繁项集粗俗的理解就是找出经常出现的组合,然后根据这些组合最终推出我们的关联规则. Apriori算法原理 Aprio

Linux集群系列之六——LVS持久连接

DR: arp_ignore = 1 arp_announce = 2 数组:变量阵列 array_name=("" "" "" ) declare -a A 把一个变量明确申明为数组 LVS的持久连接:   无论使用什么算法,LVS持久连接都能实现在一定时间内将来自同一个客户端请求派发到同一个RS. 持久连接模版(内存缓冲区): 每一个客户端 及分配给它的RS的映射关系: ipvsadm -L -c 显示当前的持久连接数 ipvsadm -A|

Atitit 数据存储的数据表连接attilax总结

1.1. 三种物理连接运算符:嵌套循环连接.合并连接以及哈希连接1 1.2. a.嵌套循环连接(nested loops join)1 1.3. b.合并连接(merge join)3 1.4. c.哈希连接(hash join) 4 1.5. 所以这三种算法,没有谁好谁坏,只有合适的场景应用合适的连接算法,这样才能发挥它自身的长处,而恰巧这些就是我们要掌握的技能.6 1.6. 这三种连接算法我们也可以显示的指定,loop merger hash6 1.7. 所有的最优计划的选择都是基于现有统计