有向图的邻接表和邻接矩阵

邻接表

有向图的邻接表是一种常用的表示方法,用于表示图中各个节点之间的关系。在有向图中,每条边都有一个方向,因此邻接表中的每个节点记录了该节点指向的其他节点。
具体来说,有向图的邻接表由一个由节点和它们的邻居节点列表组成的集合构成。对于每个节点,邻接表记录了该节点指向的所有邻居节点。这种表示方法可以用一个哈希表或数组来实现,其中哈希表或数组的键或索引表示节点,对应的值是一个列表,存储了该节点的所有邻居节点。
举例来说,考虑以下有向图:

A -> B, C
B -> C, D
C -> D
D -> A

对应的邻接表表示如下:

A: [B, C]
B: [C, D]
C: [D]
D: [A]

在邻接表中,每个节点及其邻居列表的组合表示了整个有向图的结构。使用邻接表可以有效地表示稀疏图,并且支持快速查找节点的邻居。

java表示这样的邻接表:
在 Java 中,可以使用 Map 来表示有向图的邻接表。具体来说,可以使用 Map<String, List>,其中键是节点的名称(如字符串表示),值是一个列表,存储了该节点指向的所有邻居节点的名称。以下是一个示例代码:

import java.util.*;public class DirectedGraph {private Map<String, List<String>> adjacencyList;public DirectedGraph() {this.adjacencyList = new HashMap<>();}public void addEdge(String source, String target) {adjacencyList.computeIfAbsent(source, k -> new ArrayList<>()).add(target);}public List<String> getNeighbors(String node) {return adjacencyList.getOrDefault(node, Collections.emptyList());}public static void main(String[] args) {DirectedGraph graph = new DirectedGraph();graph.addEdge("A", "B");graph.addEdge("A", "C");graph.addEdge("B", "C");graph.addEdge("B", "D");graph.addEdge("C", "D");graph.addEdge("D", "A");for (String node : graph.adjacencyList.keySet()) {List<String> neighbors = graph.getNeighbors(node);System.out.print(node + " -> ");for (String neighbor : neighbors) {System.out.print(neighbor + " ");}System.out.println();}}
}
}

在这个示例中,DirectedGraph 类表示有向图,使用 Map 存储邻接表。addEdge 方法用于添加一条边,getNeighbors 方法用于获取指定节点的邻居节点列表。在 main 方法中,创建了一个有向图并添加了一些边,然后遍历输出了每个节点及其邻居节点列表。

邻接矩阵

有向图的邻接矩阵是一个二维数组,用于表示图中节点之间的关系。对于有向图,邻接矩阵是一个 N × N 的矩阵,其中 N 是节点的数量,矩阵的每个元素 a[i][j] 表示从节点 i 到节点 j 是否存在一条有向边,通常用 0 或 1 表示不存在或存在边。
具体来说,邻接矩阵的构造如下:
如果图中存在一条从节点 i 到节点 j 的有向边,则将矩阵中的 a[i][j] 设为 1。
如果图中不存在从节点 i 到节点 j 的有向边,则将矩阵中的 a[i][j] 设为 0。
在有向图中,邻接矩阵是一个对称矩阵。但需要注意的是,有些情况下,如果图中存在权重(例如表示边的距离或成本),邻接矩阵的元素可能不只是 0 或 1,而是表示具体权重的数值。
举例来说,考虑以下有向图:
cssCopy code
A -> B
A -> C

B -> C

B -> D
C
C -> D
D
D -> A

对应的邻接矩阵为:
cssCopy code
A B C D

A 0 1 1 0
B 0 0 1 1
C
C 0 0 0 1
D
D 1 0 0 0

在 Java 中,可以使用二维数组来表示邻接矩阵,如下所示:
javaCopy code
int[][] adjacencyMatrix = {

{0, 1, 1, 0},{0, 0, 1, 1},{0, 0, 0, 1},{1, 0, 0, 0}

}
};

其中,adjacencyMatrix[i][j] 表示从节点 i 到节点 j 是否存在一条有向边。

用 Java 代码表示有向图的邻接矩阵,你可以使用二维数组来实现。假设有 N 个节点,可以用一个 N × N 的二维数组来表示邻接矩阵,其中 adjMatrix[i][j] 表示从节点 i 到节点 j 是否存在一条有向边。如果存在,则 adjMatrix[i][j] 为 1;否则为 0。以下是一个示例代码:
javaCopy code
public class DirectedGraph {

private int[][] adjMatrix;private int numNodes;public DirectedGraph(int numNodes) {this.numNodes = numNodes;this.adjMatrix = new int[numNodes][numNodes];}public void addEdge(int source, int target) {adjMatrix[source][target] = 1;}public void removeEdge(int source, int target) {adjMatrix[source][target] = 0;}public boolean hasEdge(int source, int target) {return adjMatrix[source][target] == 1;}public int getNumNodes() {return numNodes;}public void printAdjMatrix() {for (int i = 0; i < numNodes; i++) {for (int j = 0; j < numNodes; j++) {System.out.print(adjMatrix[i][j] + " ");}System.out.println();}}public static void main(String[] args) {DirectedGraph graph = new DirectedGraph(4);graph.addEdge(0, 1);graph.addEdge(0, 2);graph.addEdge(1, 2);graph.addEdge(1, 3);graph.addEdge(2, 3);graph.printAdjMatrix();}

}
}

在这个示例中,DirectedGraph 类表示有向图,使用二维数组 adjMatrix 来存储邻接矩阵。addEdge 方法用于添加一条边,removeEdge 方法用于删除一条边,hasEdge 方法用于判断两个节点之间是否有边。printAdjMatrix 方法用于打印邻接矩阵。在 main 方法中,创建了一个包含 4 个节点的有向图,并添加了一些边,然后打印了邻接矩阵。

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

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

相关文章

Redis之缓存穿透问题解决方案实践SpringBoot3+Docker

文章目录 一、介绍二、方案介绍三、Redis Docker部署四、SpringBoot3 Base代码1. 依赖配置2. 基本代码 五、缓存优化代码1. 校验机制2. 布隆过滤器3. 逻辑优化 一、介绍 当一种请求&#xff0c;总是能越过缓存&#xff0c;调用数据库&#xff0c;就是缓存穿透。 比如当请求一…

阿里云国际站如何助力餐饮行业出海?

近些年&#xff0c;中国企业出海方兴未艾。全球不同国家的经济政治诉求加剧了商业领域的博弈&#xff0c;全球产业供应链格局持续发生深刻变化。无论是海外建厂&#xff0c;还是海外找市场&#xff0c;中国产业链的全球布局蔚然成风,企业想突破现阶段瓶颈&#xff0c;谋求更好的…

【VIP专属】Python应用案例——基于OpenCV图像卡通化处理图像识别算法实验

目录 一、使用OpenCV卡通化图像和艺术化图像 1、读取图片、窗口显示 2、卡通化处理 3、铅笔画风

⭐北邮复试刷题106. 从中序与后序遍历序列构造二叉树__递归分治 (力扣每日一题)

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postor…

本地ip被限制,可以用代理ip吗,是怎么实现的

本地IP被限制时&#xff0c;确实可以使用代理IP来解决这个问题。以下是如何通过代理IP实现这一目标的基本过程&#xff1a; 1. 原因与解决方案&#xff1a; 当本地IP地址由于访问频率过高、违反服务条款或者受到防火墙规则屏蔽等原因而无法访问某个网站或服务时&#xff0c;可以…

ros自定义action记录

文章目录 自定义action1. 定义action文件2. 修改 package.xml3. 修改 CMakeLists.txt4. 运行 catkin build5. simple_action_server.py6. simple_action_client.py 测试 自定义action ros 版本&#xff1a;kinetic 自定义test包的文件结构如下 |-- test | |-- CMakeLists.t…

Internet Download Manager 6.42.3 (IDM) 中文免激活绿色版

相信很多网友都遇到过一种情况&#xff0c;网页有些视频资源或者音频资源不知道如何下载&#xff0c;一直不知道如何解决&#xff0c;为此小编特意带来了这款&#xff1a;Internet Download Manager电脑版&#xff0c;这是一款非常专业且十分好用的下载工具&#xff0c;也就是大…

docker (九)-进阶篇-dockerfile制作zabbix镜像(带python3环境)

环境说明&#xff1a;根据前文docker &#xff08;七&#xff09;部署zabbix进行zabbix告警配置时&#xff0c;发现zabbix没有脚本所需要的python3环境&#xff0c;也没有yum环境 参考 https://www.cnblogs.com/daniel-ming/p/15341636.html Zabbix docker镜像 build …

nifi连接Sql server数据库报错TLS问题

背景&#xff1a; 服务器&#xff1a;Linux nifi版本是&#xff1a;1.21.0 Sql Server版本是&#xff1a;10.50.6000.34 我使用generateTableFetch/queryDatabaseTable连接Sqr Server时报错&#xff1a; (驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接…

【Azure 架构师学习笔记】- Azure Databricks (9) -- UC权限

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (8) --UC架构简介 UC 是Databricks进行数据治理&#xff0c;集中权限管控&#xff0c; 提高大规模数据存储&#xff0c;共享安全性的新工具。通…

Android 11以上获取不到第三方app是否安装

开年第一篇&#xff0c;处理了一下年前的小问题。 问题&#xff1a;本地app跳转到第三方app地图进行导航&#xff0c;获取不到第三方地图是否安装。 解决&#xff1a; 1.添加包名 This can be done by adding a <queries> element in the Android manifest.在app下的…

1408: [宁波25届]方格稿纸

题目描述 小猪在小学中认识了很多的字&#xff0c;终于会写一点作文了。某天小猪买了一张方格稿纸来写作文,n 行m 列,形状如下所示&#xff1a; 上图中nm5 。 某天小猪的邻居小小猪来小猪家玩&#xff0c; 用黑墨水笔把小猪新买的方格稿纸涂黑了很多格子。 每个格子不是完全黑…

psp游戏存档收集SAVEDATA

不想从头开始 ppsspp存档目录 pc&#xff1a;ppsspp解压目录\memstick\PSP\SAVEDATA 安卓&#xff1a;根目录\PSP\SAVEDATA 噬神者2(日版) NPJH50832099c645531020001000 風燐-https://wwl.lanzouq.com/iI1R01owozxa 咲夜-https://wwl.lanzouq.com/id1tX1owp2uf につてのぬ…

华为笔记本原厂系统镜像恢复安装教程方法

1.安装方法有两种&#xff0c;一种是用PE安装&#xff0c;一种是华为工厂包安装&#xff08;安装完成自带F10智能还原&#xff09; 若没有原装系统文件&#xff0c;请在这里远程恢复安装&#xff1a;https://pan.baidu.com/s/166gtt2okmMmuPUL1Fo3Gpg?pwdm64f 提取码:m64f …

Pormise---如何解决javascript中回调的信任问题?【详解】

本人编程小白一枚&#xff0c;希望多多包涵~ 如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 回调中的信任问题回调给我们带来的烦恼&#xff1f;调用过早…

突破编程_C++_面试(数组(1))

面试题1&#xff1a;详细说明一下数组名是什么&#xff1f; 在 C 中&#xff0c;数组名代表数组首元素的地址。更具体地说&#xff0c;数组名是一个指向数组第一个元素的常量指针。这意味着&#xff0c;当使用数组名时&#xff0c;实际上是在使用指向数组第一个元素的指针。 例…

linux环境下JPS命令未找到

说明 根据小编blog安装JDK后&#xff0c;无使用JPS命令&#xff0c;是因为缺少openjdk-devel包 Linux 上安装及卸载JDK&#xff08;包含yum方式&#xff09;-CSDN博客 安装devel [rootnamenode ~]# jps bash: jps: command not found...查看devel版本 [rootnamenode ~]# yu…

【深度学习:对象跟踪】对象跟踪完整指南 [教程]

【深度学习&#xff1a;对象跟踪】对象跟踪完整指南 [教程] 什么是计算机视觉中的对象跟踪&#xff1f;对象跟踪有哪些不同类型&#xff1f;图像跟踪视频跟踪单目标跟踪多对象跟踪 计算机视觉中对象跟踪的用例监测零售自动驾驶汽车医疗保健 对象跟踪方法步骤 1&#xff1a;目标…

客户端web开发工具

文章目录 安全网络Linter-->捕获代码错误-->eslint源代码控制-->Git代码格式化-->Prettier打包工具--Parcel--Webpack 转换--Babel开发后阶段测试工具配置工具其他 node&#xff0c;npm、yarnnode.js包管理器npmyarn https://developer.mozilla.org/zh-CN/docs/Lea…

安卓系统和iOS系统的手机备忘录同步数据方法

在这个智能手机时代&#xff0c;安卓与iOS系统犹如两位王者&#xff0c;各自拥有庞大的用户群体。有人钟情于安卓的开放与多样&#xff0c;有人偏爱iOS的流畅与稳定。甚至&#xff0c;有些人为了满足不同需求&#xff0c;同时使用着两个系统的手机。我就是其中的一员。 工作中…