深度优先遍历与连通分量(Java 实例代码源码包下载)

news2024/11/14 14:54:40

目录

 

深度优先遍历与连通分量

Java 实例代码

src/runoob/graph/Components.java 文件代码:


 

深度优先遍历与连通分量

深度优先遍历(Depth First Search)的主要思想是首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点。当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过。

下图示例的图从 0 开始遍历顺序如右图所示:

 

e939335538f1ae1e7bcfc733b3a98d5b.png

无向图 G 的一个极大连通子图称为 G 的一个连通分量(或连通分支)。连通图只有一个连通分量,即其自身;非连通的无向图有多个连通分量。连通分量与连通分量之间没有任何边相连。深度优先遍历可以用来求连通分量。

下面以求连通分量为例,来实现图的深度优先遍历,称为 dfs。下面代码片段中,visited 数组记录 dfs 的过程中节点是否被访问,ccount 记录联通分量个数,id 数组代表每个节点所对应的联通分量标记,两个节点拥有相同的 id 值代表属于同一联通分量。

...
// 构造函数, 求出无权图的联通分量
public Components(Graph graph){
    // 算法初始化
    G = graph;
    visited = new boolean[G.V()];
    id = new int[G.V()];
    ccount = 0;
    for( int i = 0 ; i < G.V() ; i ++ ){
        visited[i] = false;
        id[i] = -1;
    }
    // 求图的联通分量
    for( int i = 0 ; i < G.V() ; i ++ )
        if( !visited[i] ){
            dfs(i);
            ccount ++;
        }
}
...

图的深度优先遍历是个递归过程,实现代码:

...
// 图的深度优先遍历
void dfs( int v ){

    visited[v] = true;
    id[v] = ccount;

    for( int i: G.adj(v) ){
        if( !visited[i] )
            dfs(i);
    }
}
...

Java 实例代码

源码包下载:Download

src/runoob/graph/Components.java 文件代码:

package runoob.graph;

import runoob.graph.read.Graph;

/**
 * 深度优先遍历
 */
public class Components {

    Graph G;                    // 图的引用
    private boolean[] visited;  // 记录dfs的过程中节点是否被访问
    private int ccount;         // 记录联通分量个数
    private int[] id;           // 每个节点所对应的联通分量标记

    // 图的深度优先遍历
    void dfs( int v ){

        visited[v] = true;
        id[v] = ccount;

        for( int i: G.adj(v) ){
            if( !visited[i] )
                dfs(i);
        }
    }

    // 构造函数, 求出无权图的联通分量
    public Components(Graph graph){

        // 算法初始化
        G = graph;
        visited = new boolean[G.V()];
        id = new int[G.V()];
        ccount = 0;
        for( int i = 0 ; i < G.V() ; i ++ ){
            visited[i] = false;
            id[i] = -1;
        }

        // 求图的联通分量
        for( int i = 0 ; i < G.V() ; i ++ )
            if( !visited[i] ){
                dfs(i);
                ccount ++;
            }
    }

    // 返回图的联通分量个数
    int count(){
        return ccount;
    }

    // 查询点v和点w是否联通
    boolean isConnected( int v , int w ){
        assert v >= 0 && v < G.V();
        assert w >= 0 && w < G.V();
        return id[v] == id[w];
    }
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/902343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI在日常生活中的应用:从语音助手到自动驾驶

文章目录 AI的定义和发展AI在日常生活中的应用1. **智能语音助手**2. **智能家居**3. **智能医疗**4. **自动驾驶** 代码示例&#xff1a;使用Python实现基于机器学习的图片分类AI的未来前景结论 &#x1f389;欢迎来到AIGC人工智能专栏~探索AI在日常生活中的应用 ☆* o(≧▽≦…

centos9 mysql8修改数据库的存储路径

一、环境 系统&#xff1a;CentOS Stream release 9 mysql版本&#xff1a;mysql Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL) 二、修改mysql的数据库&#xff0c;存储路径 查看目录数据存储的位置 cat /etc/my.cnf操作 1、新建存放的目录&#xff0c;…

【leetcode 力扣刷题】数组交集(数组、set、map都可实现哈希表)

数组交集 349. 两个数组的交集排序&#xff0b;双指针数组实现哈希表unordered_setunordered_map 350. 两个数组的交集Ⅱ排序 双指针数组实现哈希表unordered_map 349. 两个数组的交集 题目链接&#xff1a;349. 两个数组的交集 题目内容如下&#xff0c;理解题意&#xff1a…

react 10之状态管理工具2 redux + react-redux +redux-saga

目录 react 10之状态管理工具2 redux store / index.js 入口文件actionType.js actions常量的文件rootReducer.js 总的reducer 用于聚合所有模块的 reducerrootSaga.js 总的saga 用于聚合所有模块的 sagastore / form / formActions.js 同步修改 isShowstore / form / formRedu…

[机缘参悟-100] :今早的感悟:儒释道代表了不同的人生观、思维模式决定了人的行为模式、创业到处是陷阱、梦想与欺骗其实很容易辨认

目录 一、关于儒释道 二、关于成长性思维与固定性思维 三、关于创业 四、关于梦想与忽悠 一、关于儒释道 儒&#xff1a;逆势而为&#xff0c;修身齐家治国平天下&#xff0c;大公无私 佛&#xff1a;万法皆空&#xff0c;众生皆苦&#xff0c;普度众生&#xff0c;无公无…

如何构建 NodeJS 影院微服务并使用 docker 进行部署

图片来自谷歌 — 封面由我制作 一、说明 构建一个微服务的电影网站&#xff0c;需要Docker、NodeJS、MongoDB&#xff0c;这样的案例您见过吗&#xff1f;如果对此有兴趣&#xff0c;您就继续往下看吧。 在本系列中&#xff0c;我们将构建一个 NodeJS 微服务&#xff0c;并使用…

相邻节点迭代器(Java 实例代码源码包下载)

目录 相邻节点迭代器 Java 实例代码 src/runoob/graph/DenseGraphIterater.java 文件代码&#xff1a; src/runoob/graph/SparseGraphIterater.java 文件代码&#xff1a; 相邻节点迭代器 图论中最常见的操作就是遍历邻边&#xff0c;通过一个顶点遍历相关的邻边。邻接矩阵…

Python编程基础-函数

函数定义与调用 将完成某一特定功能并经常使用的代码编写成函数&#xff0c;在需要使用时直接调用 def 函数名(函数参数): 函数体 return 表达式或者值 def printHello(): #打印hello字符串print (hello)def printNum(): #输出0--9数字for i in range(0,10):print (i)return…

Unity 变量修饰符 之protected ,internal,const , readonly, static

文章目录 protectedinternalconstreadonlystatic protected 当在Unity中使用C#编程时&#xff0c;protected是一种访问修饰符&#xff0c;用于控制类成员&#xff08;字段、方法、属性等&#xff09;的可见性和访问权限。protected修饰的成员可以在当前类内部、派生类&#xf…

大数据背景和概念

一、背景 1.岗位现状 大数据在一线互联网已经爆发了好多年&#xff0c;2015年-2020年&#xff08;国内互联网爆发期&#xff09;那时候的大数据开发&#xff0c;刚毕业能写Hive SQL配置个离线任务、整个帆软报表都20K起步。如果做到架构师&#xff0c;50K跑不掉。现在市场回归…

字符串旋转(2)

题目要求&#xff1a; 写一个函数&#xff0c;判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如&#xff1a; 给定s1 AABCD和s2 BCDAA&#xff0c;返回1。给定s1abcd和s2ACBD&#xff0c;返回0。AABCD左旋一个字符得到ABCDAAABCD左旋两个字符得到BCDAAAABCD右旋一个…

Stm32学习记录之中断

1、前言 该系列文章用于记录个人学习stm32单片机的过程&#xff0c;欢迎指导讨论~。 2、中断知识点梳理 中断 { N V I C ( 内嵌向量中断控制器 ) { 中断向量表 优先级 { 抢占优先级 响应优先级 自然优先级 优先级分组 E X T I ( 外部中断 ) { 触发方式 { 上边沿 下边沿 双边沿 …

wazuh安装、Rootkit原理解析与检测实践

目录 1.wazuh 1&#xff09;什么是wazuh 2&#xff09;安装wazuh 方法一&#xff1a;仓库安装&#xff08;跟着官方文档走&#xff09; 方法二&#xff1a;虚拟机OVA安装 2.Rootkit原理解析与检测实践 Rootkit主要分为以下2种 解压并编译这个文件 利用chkrootkit检查rootk…

看了这么多热闹,AI帮助你解决实际问题了吗?

经历了近两个月的日更之后&#xff0c;这个星期发文频率有所下降&#xff0c;日更需要花费更多的时间精力&#xff0c;而这恰恰是一个人忙起来之后无法保证的。后续发文频率稍做调整&#xff0c;内容会继续保持更新。 前几日小米发布会&#xff08;雷老板2023年度演讲&#xff…

EndNote-文献管理工具【安装篇】

下载&#xff1a;&#xff08;文末附安装包&#xff0c;建议使用这一个&#xff0c;官网都需要付费&#xff09; 打开安装包&#xff0c;双击&#xff1a; 安装完了之后不要直接运行&#xff0c;因为EndNote软件少了一个类型的软件&#xff1a;GB/T17714。 因此我们需要把这个…

实现两个栈模拟队列

实现两个栈模拟队列 思路&#xff1a;可以想象一下左手和右手&#xff0c;两个栈&#xff1a;stack1&#xff08;数据所在的栈&#xff09; &#xff0c;stack2&#xff08;临时存放&#xff09;。 入队&#xff1a;需要将入队 num 加在 stack1 的栈顶即可&#xff1b; 出队&am…

plt绘制箱型图+散点图

import numpy as np import matplotlib.pyplot as plt# 创建示例数据 np.random.seed(1) data [np.random.normal(0, std, 100) for std in range(1, 4)]# 绘制箱型图 plt.boxplot(data, patch_artistTrue,zorder0)# 添加数据点的散点图&#xff0c;并设置参数以避免重叠 for …

[四次挥手]TCP四次挥手握手由入门到精通(知识精讲)

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

Pytorch的torch.utils.data中Dataset以及DataLoader等详解

在我们进行深度学习的过程中&#xff0c;不免要用到数据集&#xff0c;那么数据集是如何加载到我们的模型中进行训练的呢&#xff1f;以往我们大多数初学者肯定都是拿网上的代码直接用&#xff0c;但是它底层的原理到底是什么还是不太清楚。所以今天就从内置的Dataset函数和自定…