【Java】图的初识

文章目录

  • 【Java】图的初识
    • 图是什么
      • 图的基本组成部分
      • 图的类型
      • 图的表示方法
      • 图的常见操作
    • Java中图的表示方法
      • 邻接矩阵
      • 邻接表
    • 常见操作
      • 图的遍历
        • 深度优先搜索(DFS)
        • 广度优先搜索(BFS)
    • 结论

【Java】图的初识

图是什么

图是一种数学概念,用于表示对象及其相互关系。图由顶点(Vertex)和边(Edge)组成,广泛应用于计算机科学、网络分析、物流优化、社交网络等领域。图可以表示各种实际问题,如城市中的交通线路、社交网络中的人际关系等。

图的基本组成部分

  1. 顶点(Vertex)
    • 顶点是图中的一个节点,表示一个对象或实体。
    • 在图中,顶点通常用圆圈或点表示。
    • 顶点可以有名字或编号,用于区分不同的顶点。
  2. 边(Edge)
    • 边是连接两个顶点的线段,表示顶点之间的关系或连接。
    • 边可以是有向的(箭头表示方向)或无向的(无箭头表示无方向)。

图的类型

根据边的性质和连接方式,图可以分为以下几种类型:

  1. 无向图(Undirected Graph)

    • 在无向图中,边没有方向,表示两个顶点之间的关系是双向的。
    • 无向图的边通常用线段表示,不带箭头。
    • 在这里插入图片描述
  2. 有向图(Directed Graph)

    • 在有向图中,边有方向,表示从一个顶点指向另一个顶点。
    • 有向图的边通常用带箭头的线段表示,箭头指示方向。
    • 在这里插入图片描述
  3. 加权图(Weighted Graph)

    • 在加权图中,边带有权重,表示顶点之间的关系具有某种度量(如距离、成本等)。
    • 加权图可以是有向图也可以是无向图,边的权重通常用数值表示。
    • 在这里插入图片描述

图的表示方法

在计算机科学中,图的表示方法主要有以下几种:

  1. 邻接矩阵(Adjacency Matrix)
    • 邻接矩阵是一种二维数组,用于表示顶点之间的连接关系。
    • 如果顶点i和顶点j之间有边,则matrix[i][j]为1(或权重值),否则为0。
    • 邻接矩阵适用于稠密图(边数接近顶点数的平方),但对于稀疏图(边数远小于顶点数的平方)来说,存储效率较低。
  2. 邻接表(Adjacency List)
    • 邻接表是一种数组加链表的结构,每个顶点对应一个链表,链表中存储与该顶点相邻的顶点。
    • 邻接表适用于稀疏图,存储效率较高,因为只存储实际存在的边。

图的常见操作

在使用图时,有许多常见的操作,包括:

  1. 添加边:在图中添加一条边,以表示两个顶点之间的新关系。
  2. 删除边:从图中删除一条边,以表示两个顶点之间的关系不再存在。
  3. 遍历图:访问图中的所有顶点和边,常用的遍历方法包括深度优先搜索(DFS)和广度优先搜索(BFS)。

Java中图的表示方法

在Java中,图的表示方法主要有两种:邻接矩阵(Adjacency Matrix)和邻接表(Adjacency List)。

邻接矩阵

邻接矩阵是一种二维数组,用于表示顶点之间的连接关系。如果顶点i和顶点j之间有边,则matrix[i][j]为1(或权重值),否则为0。

public class Graph {private int[][] adjacencyMatrix;private int numVertices;public Graph(int numVertices) {this.numVertices = numVertices;adjacencyMatrix = new int[numVertices][numVertices];}public void addEdge(int i, int j) {adjacencyMatrix[i][j] = 1;adjacencyMatrix[j][i] = 1; // 对于无向图}public void removeEdge(int i, int j) {adjacencyMatrix[i][j] = 0;adjacencyMatrix[j][i] = 0; // 对于无向图}public void printGraph() {for (int i = 0; i < numVertices; i++) {for (int j = 0; j < numVertices; j++) {System.out.print(adjacencyMatrix[i][j] + " ");}System.out.println();}}
}

邻接表

邻接表是一种数组加链表的结构,每个顶点对应一个链表,链表中存储与该顶点相邻的顶点。

import java.util.LinkedList;public class Graph {private LinkedList<Integer>[] adjacencyList;private int numVertices;public Graph(int numVertices) {this.numVertices = numVertices;adjacencyList = new LinkedList[numVertices];for (int i = 0; i < numVertices; i++) {adjacencyList[i] = new LinkedList<>();}}public void addEdge(int i, int j) {adjacencyList[i].add(j);adjacencyList[j].add(i); // 对于无向图}public void removeEdge(int i, int j) {adjacencyList[i].remove((Integer) j);adjacencyList[j].remove((Integer) i); // 对于无向图}public void printGraph() {for (int i = 0; i < numVertices; i++) {System.out.print("Vertex " + i + ":");for (Integer edge : adjacencyList[i]) {System.out.print(" -> " + edge);}System.out.println();}}
}

常见操作

图的遍历

图的遍历主要有深度优先搜索(DFS)和广度优先搜索(BFS)。

深度优先搜索(DFS)

深度优先搜索是一种遍历图的方法,从一个起始顶点出发,沿着一条路径尽可能深入,然后回溯继续搜索未访问的顶点。

import java.util.Stack;public void depthFirstSearch(int startVertex) {boolean[] visited = new boolean[numVertices];Stack<Integer> stack = new Stack<>();stack.push(startVertex);while (!stack.isEmpty()) {int vertex = stack.pop();if (!visited[vertex]) {visited[vertex] = true;System.out.print(vertex + " ");for (int i : adjacencyList[vertex]) {if (!visited[i]) {stack.push(i);}}}}
}
广度优先搜索(BFS)

广度优先搜索是一种遍历图的方法,从一个起始顶点出发,逐层访问相邻的顶点。

import java.util.LinkedList;
import java.util.Queue;public void breadthFirstSearch(int startVertex) {boolean[] visited = new boolean[numVertices];Queue<Integer> queue = new LinkedList<>();queue.add(startVertex);while (!queue.isEmpty()) {int vertex = queue.poll();if (!visited[vertex]) {visited[vertex] = true;System.out.print(vertex + " ");for (int i : adjacencyList[vertex]) {if (!visited[i]) {queue.add(i);}}}}
}

结论

图是计算机科学中非常重要的数据结构,理解图的基本概念和Java中的实现方法对于解决很多复杂问题都非常有帮助。通过本篇博客的介绍,希望大家对图有一个初步的了解,并能够在实际编程中应用图的相关知识。

如果你有任何问题或建议,欢迎在评论区留言。谢谢阅读!

已经到底啦!!

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

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

相关文章

Unity 使用TextMeshPro实现图文混排

最后实现出的效果是这样的 开始实现 准备两张图 选中图片右键->Create->TextMeshPro->Sprite Asset 然后文件夹内就会出现一个同名的这个文件 新建一个Text Inspector面板 点击最底下的Extra Settings 然后把刚刚创建的SpriteAsset拖过来 放到对应的地方 然后…

富瀚微FH8322 ISP图像调试—BLC校正

1、简单介绍 目录 1、简单介绍 2、调试方法 3、输出结果 富瀚微平台调试有一段时间了&#xff0c;一直没有总结&#xff0c;我们调试ISP的时候&#xff0c;首先一步时确定好sensor的黑电平值&#xff0c;黑电平如果不准&#xff0c;则会影响到后面的颜色及对比度相关模块。…

【CSS】background怎么设置多个背景图

在CSS中设置多个背景图片可以通过background-image属性来实现&#xff0c;不同的背景图像之间使用逗号隔开。以下是一个详细的步骤和示例来说明如何设置多个背景图&#xff1a; 步骤&#xff1a; 选择容器&#xff1a;首先&#xff0c;你需要选择一个HTML元素作为背景图片的容…

演绎推理三段论(大前提、小前提、结论)

演绎推理三段论&#xff08;大前提、小前提、结论&#xff09; 假设我们正在讨论一个关于植物生长的推理。 大前提&#xff1a;所有的植物都需要阳光才能进行光合作用&#xff0c;从而生长。 这个陈述是一个普遍性的原则&#xff0c;它描述了植物这一类生物体的一个共同特征…

快消品经销商需要注意哪些仓库管理细节,才能提效降本

仓库管理是快消品经销商必须重视的环节&#xff0c;只有仓库管理做好了&#xff0c;整体效率才能得到提升&#xff0c;成本才能降低&#xff0c;客户订单更快地交付&#xff0c;而在仓库管理中有很多细节需要经销商注意。 01仓库布局与设计&#xff1a;合理的仓库布局可以极大地…

Java17 --- SpringSecurity之OAuth2

一、OAuth2 1.1、使用github以授权码方式 1.1.1、注册应用程序 1.1.2、测试代码 pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency> spring…

Oracle数据库之使用DDL语句管理表、约束(二十)

在Oracle数据库中&#xff0c;DDL&#xff08;Data Definition Language&#xff09;语句用于定义和管理数据库结构&#xff0c;如表、约束、索引等。以下是如何使用DDL语句来管理表和约束的一些示例。 1. 创建表 使用CREATE TABLE语句来创建表。 CREATE TABLE employees ( …

基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真。利用电压外环PI调节器得到有功 电流指令值结合由负载侧电流检测 到 的无功 电流指令值 &#…

最新版点微同城源码34.7+全套插件+小程序前后端(含安装教程)

模板挺好看的 带全套插件 自己耐心点配置一下插件 可以H5可以小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89394996 更多资源下载&#xff1a;关注我。

JavaScript 深拷贝和浅拷贝的实现、使用场景和存在的问题

浅拷贝 实现 方式 1&#xff08;ES 5 语法&#xff09;&#xff1a; const params Object.assign({}, state.dataForm)方式 2&#xff08;ES 6 语法&#xff09;&#xff1a; const params { ...state.dataForm }使用场景 copy 入参和出参 深拷贝 方式 1&#xff08;手…

HTTP中get与post的区别?在传输数据类型上有什么区别?【面试】

HTTP中的GET和POST是两种最常见的请求方法&#xff0c;它们在数据传输和使用场景上有一些关键的区别&#xff1a; GET请求&#xff1a; 数据传输方式&#xff1a;GET请求将数据附加在URL之后&#xff0c;形成查询字符串&#xff08;namevalue的形式&#xff09;&#xff0c;数…

嘻嘻我是图床倒霉蛋

嘻嘻花了将近两个小时的时间配了一个小小的图床 手把手教你搭建阿里云图床(PicGoTypora阿里云OSS)&#xff0c;新手小白一看就会-阿里云开发者社区 (aliyun.com) 大体上按照这篇配置就好 七牛云因为测试域名30天到期,用自己的得备案,所以比较麻烦,建议直接上阿里云 我买了一…

股指期货功能

其金融期货的本质&#xff0c;决定了股指期货具有以下几方面特点&#xff1a; &#xff08;1&#xff09;交割方式为现金交割&#xff1b; &#xff08;2&#xff09;股指期货的持有成本较低&#xff1b; &#xff08;3&#xff09;股指期货的保证金率较低&#xff0c;杠杆性…

jrt从量变到质变

又是一个加班的周末&#xff0c;上周把台式机代码和数据库环境弄好了&#xff0c;这周进行大数据测试&#xff0c;直接把标本、标本医嘱、报告、报告结果、药敏结果等数据插入到1亿的规模&#xff0c;跑了一天一夜插入了5000多万个标本&#xff0c;后面接着补剩下的到一亿。 演…

jvm工具-jps、jstat、jmap、jstack

一、jps jps -v 【输出进程启动参数】 [rootVM-8-2-centos ~]# jps -v 12401 Jps -Dapplication.home/usr/local/jdk1.8.0_241 -Xms8m 16964 jar 其他参考 Java八股文必看&#xff0c;入门到深入理解jvm虚拟机之基础故障指令【jps&#xff0c;jstate...】-CSDN博客 二、j…

C++二进制文件的读与写

1. 二进制文件的读与写ofstream fout; ifstream fin; ——学习把结构体类型写到二进制文件中。 代码实现&#xff1a; /* _4.cpp 学习总结 视频学习C_Primer_Plus_17_6 1. 二进制文件的读与写 2. 写操作&#xff1a;fout类比cout操作&#xff0c;cout能操作的fout也适用 3. 易…

书生·浦语大模型实战营第二期作业六

1、安装环境&#xff1a; 2、安装legent和agentlego&#xff1a; 3、部署apiserver&#xff1a; 4、legent web demo&#xff1a; 5、没搜到&#xff0c;很尴尬&#xff1a; 6、自定义工具&#xff1a; 7、智能体“乐高”&#xff1a; 8、智能体工具&#xff0c;识别图片&#…

Leetcode274. H 指数(简单易于理解)

题目描述 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她&#x…

Java文件/文件夹的新增/删除/递归遍历

获取File对象 这里的字符串可以乱写&#xff0c;但是如果不存在后续的操作也会失败 // 获取抽象的File对象&#xff08;文件或者目录&#xff0c;不一定真实存在&#xff09;File file1 new File("D:\\2_WorkSpace\\qcbyProject\\shixun\\collection-test\\src\\FileTes…

Java基础 - 注解

注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”&#xff1a; // this is a component: Resource("hello") public class Hello {Injectint n;PostConstructpublic void hello(Param String name) {System.out.println(name);}Overridepublic String…