图(Graph)

news2024/11/29 18:48:13
Graph

图由顶点(vertex /ˈvɜːrteks/)和边(edge /edʒ/)组成的一种结构。
顶点的集合V,边的集合是E,所以图记为G =(V,E)
总结:
顶点是一维数组,而边是二维数组; 假如顶点个数是n,则一维数组的长度是n,二维数组长度n的平方

无向图

图中存在任意两个顶点之间的边都是没有方向的

有向图

图中存在任意两个顶点之间的边都是有方向的

有向完全图

任意两个顶点之间都存在方向互为相反的两条弧

图的权

有些图的边或弧具有与他相关的数字

连通图

从顶点v到顶点v‘存在路径

无向图顶点边的条数叫度,有向图顶点的边叫入度和出度

图的存储结构(邻接矩阵)

如果图G有n个顶点,则邻接矩阵是一个n*n的方阵
无向图的边数组(二维数组)是一个对称矩阵
带权的邻接矩阵

在这里插入图片描述

图的深度优先遍历和广度优先遍历算法

构建张图的矩阵信息, Graph.java,代码如下:

package com.tangkun.graph;

/**
 * 图
 * 定义图的结构
 */
public class Graph {

	/**
	 * 结点个数
	 */
	protected int size;
	/**
	 * 定义数组,保存顶点信息
	 */
	protected String nodes[];
	/**
	 * 定义矩阵,保存顶点信息
	 */
	protected int edges[][];

	/**
	 * 首先将图转换成邻接矩阵,也就是任意两个顶点之间的边信息
	 *
	 * 	  A B C D E F G
	 * A  0 0 1 1 0 1 0
	 * B  0 0 1 0 0 0 0
	 * C  1 1 0 1 0 0 0
	 * D  1 0 1 0 0 0 0
	 * E  0 0 0 0 0 0 1
	 * F  1 0 0 0 0 0 1
	 * G  0 0 0 0 1 1 0
	 */
	public Graph() {
		//重新定义顶点大小,顶点数组,边的矩阵
		nodes = new String[]{"A", "B", "C", "D", "E", "F", "G"};
		size = nodes.length;
		edges = new int[size][size];

		//为每一个顶点定一个一个int型变量,方便在边的二维数组中表示
		int A = 0;
		int B = 1;
		int C = 2;
		int D = 3;
		int E = 4;
		int F = 5;
		int G = 6;

		//二维数组中第1个索引就表示上面矩阵中的纵坐标,二维数组中第2个索引就表示上面矩阵中的横坐标
		edges[A][C] = 1;
		edges[A][D] = 1;
		edges[A][F] = 1;
		edges[B][C] = 1;
		edges[C][A] = 1;
		edges[C][D] = 1;
		edges[C][B] = 1;
		edges[D][A] = 1;
		edges[D][C] = 1;
		edges[E][G] = 1;
		edges[F][A] = 1;
		edges[F][G] = 1;
		edges[G][F] = 1;
		edges[G][E] = 1;
	}
}

深度优先和广度优先算法, GraphTraverse.java,代码如下:

package com.tangkun.graph;

/**
 * 图的遍历
 */
public class GraphTraverse extends Graph {

	/**
	 * 定义一个数组,用于记录已经访问过的顶点
	 */
	private int visited[] = new int[size];

	/**
	 * 图的深度优先遍历
	 *
	 * @param start 开始的结点索引
	 */
	private void deepFirst(int start) {
		//将这个顶点存到visited数组中,并标记这个顶点已经被访问过
		visited[start] = 1;
		System.out.println("遍历到 " + nodes[start] + " 顶点");
		//从start顶点开始,与顶点集合中的顶点进行循环比较,判断这两个顶点之间是否存在有边(判断edges[start][i]是否==1)
		for (int i = 0; i < nodes.length; i++) {
			//判断这两个顶点之间是否存在边,并且判断这个i顶点是否已经被访问过,访问过则无须再次遍历
			if (edges[start][i] == 1 && visited[i] == 0) {
				//如果这两个顶点之间存在一条边,则递归遍历这个新的顶点下面顶点
				deepFirst(i);
			}
		}
	}

	/**
	 * 定义数组,根据根结点的长度分批次存储邻接结点,首先存储根结点,然后存储距离根结点路径为1的邻接结点,然后存储距离根结点路径为2的邻接结点。。。直至没有邻接结点
	 */
	private int queue[] = new int[size];

	/**
	 * 图的广度优先遍历
	 * 广度优先搜索遍历图的过程中以v为起始点,由近至远,
	 * 依次访问和v有路径相通且路径长度为1,2,…的顶点
	 * 第一批节点的邻接点
	 */
	private void breadthFisrt(int front, int tail) {
		//最后访问的邻接结点索引,初始值为第一批邻接结点的尾结点
		int last = tail;
		for (int index = front; index <= tail; index++) {
			//打印当前遍历到的结点
			int node = queue[index];
			System.out.println("遍历到 " + nodes[node] + " 顶点");
			//找出所有邻接结点
			for (int i = 0; i < size; i++) {
				if (edges[index][i] == 1 && visited[i] == 0) {
					//标记该邻接结点已访问
					visited[i] = 1;
					//将遍历到的第二批邻接结点存起来
					queue[++last] = i;
				}
			}
		}
		//如果上面遍历出来的第二批邻接结点个数大于0,递归遍历第二批邻接结点的下一批结点
		if (last > tail) {
			//递归遍历第二批邻接结点的下一批邻接结点
			breadthFisrt(tail + 1, last);
		}
	}

	private void breadthFirst(int start) {
		queue[0] = start;
		visited[start] = 1;
		breadthFisrt(0, 0);
	}

	public static void main(String[] args) {
		GraphTraverse graphTraverse = new GraphTraverse();
		System.out.println("图的深度优先遍历");
		graphTraverse.deepFirst(0);

		System.out.println();

		GraphTraverse graphTraverse2 = new GraphTraverse();
		System.out.println("图的广度度优先遍历");
		graphTraverse2.breadthFirst(0);
	}
}


打印日志:
> Task :javalib:GraphTraverse.main()
图的深度优先遍历
遍历到 A 顶点
遍历到 C 顶点
遍历到 B 顶点
遍历到 D 顶点
遍历到 F 顶点
遍历到 G 顶点
遍历到 E 顶点

图的广度度优先遍历
遍历到 A 顶点
遍历到 C 顶点
遍历到 D 顶点
遍历到 F 顶点
遍历到 B 顶点
遍历到 G 顶点

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

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

相关文章

Pycharm无法添加Conda新建的虚拟环境

Pycharm无法添加Conda新建的虚拟环境&#xff0c;点击没反应&#xff0c;在idea.log文件中报错&#xff1a;CondaPythonLegacy - Can’t find python path to use, will use conda run instead 1.问题描述&#x1f50d; 在PyCharm中&#xff0c;依次单击File>Settings>P…

Netty核心技术一--Netty介绍和应用场景

1. 学习要求 要求已经掌握了 Java 编程&#xff0c; 主要技术构成&#xff1a; Java OOP 编程、Java 多线程编程、JavaIO 编程 、Java 网络编程、常用的Java 设计模式(比如观察者模式&#xff0c;命令模式&#xff0c;职责链模式 )、常用的数据结构(比如 链表) 2 Netty的介绍…

C++: 计时器类的设计和实现

文章目录 1. 目的2. 功能列表3. 基础功能&#xff1a;获取耗时4. API 设计: Timer 类5. 单元测试6. API 实现 1. 目的 使用 C Class 的形式&#xff0c;封装原本 C语言的获取时间的函数&#xff0c;提供更容易使用的计时器调用。 使用 C03&#xff0c;原因是和先前的线程安全队…

ATT-ACK靶场渗透(一)

开启内网环境 kali攻击机ip为 192.168.88.156 主机发现、端口扫描 进行主机发现 nmap -sS 192.168.88.156/24 -Pn 192.168.88.1和192.168.88.2可能为网关之类的&#xff0c;不管 weblogic漏洞利用 192.168.88.182开放了80端口和7001&#xff08;weblogic&#xff09;端口…

超越预期:ConvNeXt技术催生YOLOv5目标检测巨变 ,实现超准确率

目录 引言一、ConvNeXt的介绍1、目标检测的重要性2、YOLOv5的介绍3、ConvNeXt原理和特点4、ConvNeXt结构 二、相关研究综述1、目标检测的基础原理和流程2、YOLOv5的特点与局限性3、ConvNeXt技术在目标检测中的应用现状 三、ConvNeXt在YOLOv5中的应用与改进1、安装PyTorch和torc…

阿里Java工程规约(来源阿里)

一、应用分层 1.开放接口层&#xff1a; 可直接封装 Service 接口暴露成 RPC 接口&#xff1b;通过 Web 封装成 http 接口&#xff1b;网关控制层等。 2.终端显示层&#xff1a; 各个端的模板渲染并执行显示层。当前主要是 velocity 渲染&#xff0c;JS 渲染&#xff0c;JSP 渲…

[golang gin框架] 33.Gin 商城项目- 微信支付操作相关功能讲解

一.微信支付准备工作 准备工作 申请条件: 个体工商户 、企业、政府及事业单位 PC网站接入支付官网,其他(app,小程序,公众号等)可参考 PC网站接入支付 需要获取内容 appid&#xff1a;应用 APPID&#xff08;必须配置&#xff0c;开户邮件中可查看&#xff09; MCHID&#xff1a…

Java Socket和ServerSocket 使用

在Java中&#xff0c;Socket和ServerSocket是用于创建网络连接的重要类。Socket类用于创建客户端套接字&#xff0c;而ServerSocket类用于创建服务器套接字。在本文中&#xff0c;我们将讨论Socket和ServerSocket的作用、使用方法以及相关代码示例。 Socket的作用 Socket是Jav…

【连续介质力学】张量的并矢和性质1

张量的代数操作 并矢 Dyadic 两个向量的张量积是一个并矢&#xff0c;得到一个二阶张量 u ⃗ v ⃗ u ⃗ ⨂ v ⃗ A \vec u \vec v \vec u \bigotimes \vec v A u v u ⨂v A 其中&#xff0c; ⨂ \bigotimes ⨂是张量乘积&#xff0c;任意张量可以表示成并矢的线性组合 …

戴尔 Dell XPS 13 7390电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板戴尔 Dell XPS 13 7390 处理器Intel Core i7-10510u已驱动 内存 16 GB ( 酷兽 DDR4 3200MHz 8GB x 2 )已驱动 硬盘三星 SSD 860 EVO 250GB (250 …

【iOS】--KVC与KVO

键值编码&#xff08;KVC&#xff09;与键值监听&#xff08;KVO&#xff09; KVC&#xff08;Key Value Coding&#xff09;允许以字符串的形式间接操作对象的属性。 简单的KVC 最基本的KVC由NSKeyValueCoding协议提供支持&#xff0c;最基本的操作属性的两个方法如下 set…

利用具有局部信息的引导自注意进行息肉分割

文章目录 Using Guided Self-Attention with Local Information for Polyp Segmentation摘要本文方法PP-Guided Self-AttentionLocal-to-Global Mechanism损失函数 实验结果 Using Guided Self-Attention with Local Information for Polyp Segmentation 摘要 背景 自动准确的…

Microsoft Edge是一款现代化的浏览器,它拥有众多功能和强大的性能

随着互联网的不断发展&#xff0c;浏览器已经成为我们日常生活中必不可少的工具之一。作为一款现代化的浏览器&#xff0c;Microsoft Edge拥有许多强大的功能&#xff0c;为用户带来更加流畅的浏览体验。最近&#xff0c;Edge推出了分屏功能&#xff0c;这项功能可以大大提高生…

STM32------ADC

ADC 1、ADC介绍 1、1介绍 ADC即模数转换器。 例如&#xff1a;电信号转化成数字量。 1、2 ADC类型 并联比较型、逐次逼近型 并联比较型如下&#xff1a; 分压部分比较部分编码部分。 ADC分辨率&#xff1a;三位&#xff08;上图&#xff09; 优点&#xff1a;转换速度快…

类和对象下

文章目录 一、初始化列表1、语法&#xff1a;2、初始化顺序 二、static成员三、友元1、友元函数2、友元类 四、拷贝对象时的编译器优化例1、例2、例3、 一、初始化列表 1、语法&#xff1a; 初始化列表&#xff1a; 以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员…

【Python PyTorch】零基础也能轻松掌握的学习路线与参考资料

文章目录 一、PyTorch的基础知识二、PyTorch数据处理三、PyTorch模型构建四、PyTorch模型训练和评估五、总结 作为当前最流行的深度学习框架之一&#xff0c;PyTorch已成为许多数据科学家和深度学习工程师的首选。本文将提供一条针对初学者的完整的学习路线&#xff0c;包括PyT…

hnust 湖南科技大学 2023 安卓 期中考试 复习资料

前言 ★&#xff1a;录音中提到的致谢&#xff1a;hwl&#xff0c;lqx&#xff0c;ly&#xff0c;sw重点来源&#xff1a;7-8班 PPT和录音内容来源&#xff1a;PPT知识点大多很抽象&#xff0c;需要联系实际代码来理解多做1-9章课后习题&#xff0c;编程题可以不做获取最新版本…

【AI大模型】“讯飞星火”大模型计划10月底赶超ChatGPT

文章目录 前言你使用过这种对话式AI吗&#xff1f;有什么看法或感受&#xff1f;“讯飞星火大模型将超越chatgpt&#xff1f;”这类型的人工智能对现在的社会有什么意义&#xff1f;这类型的人工智能&#xff0c;未来前景如何&#xff1f;申请体验写在最后 前言 5月6日&#xf…

第十三章 使用Postfix与Dovecot部署邮件系统

文章目录 第十三章 使用Postfix与Dovecot部署邮件系统一、电子邮件系统1、常见的邮件协议2、注意事项 二、部署电子邮件系统1、部署基础的电子邮件系统&#xff08;1&#xff09;、配置服务器主机名称&#xff08;2&#xff09;、配置服务器的DNS地址&#xff08;3&#xff09;…

【LeetCode: 115. 不同的子序列 | 暴力递归=>记忆化搜索=>动态规划 | 位置对应】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…