图的结构模板及遍历

图:由点的集合和边的集合组成。

常用的表示图的方法有两种:
1、邻接表法

将一个点的邻居都列出来。有向图只列出从这个点出发向外发散的点

2、邻接矩阵法

将点集列出一列行,列出一列列,在矩阵中填两点之间的权值(距离)

【精选】数据结构:图(Graph)【详解】_数据结构图_UniqueUnit的博客-CSDN博客

解图有关的题目的思路:

图有很多表达方式,我们通常都是 先将图转化为熟悉的表达方式,再实现算法

图结构模板
package graph;import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;public class Graph {public HashMap<Integer, Node> nodes;//点集:编号、点public HashSet<Edge> edges;//边集:边public Graph() {nodes = new HashMap<>();edges = new HashSet<>();}}class Node {public int value;//数据public int in;//入度public int out;//出度public ArrayList<Node> nexts;//对有向图,从当前这个点出发发散的直接邻居的点public ArrayList<Edge> edges;//对有向图,发散出去的边属于这个点,指向进来的边则不属于这个点public Node(int value) {this.value = value;in = 0;out = 0;nexts = new ArrayList<>();edges = new ArrayList<>();}
}class Edge {public int weight;//权值public Node from;//边的起点public Node to;//边的终点public Edge(int weight, Node from, Node to) {this.weight = weight;this.from = from;this.to = to;}
}

其他图的方式转化为此结构示例

原来的表达方式

权值weight始节点from末节点to
501
312
702
package graph;public class Transmit {//matrix矩阵,n*3,[weight,from,to]public static Graph creatGraph(Integer[][] matrix) {Graph graph = new Graph();for (int i = 0; i < matrix.length; i++) {//遍历每组数据Integer weight = matrix[i][0];Integer from = matrix[i][1];Integer to = matrix[i][2];if (!graph.nodes.containsKey(from)) {//没有from节点graph.nodes.put(from, new Node(from));//创建from节点,加入到图的点集之中}if (!graph.nodes.containsKey(to)) {//没有to节点graph.nodes.put(to, new Node(to));//创建to节点,加入到图的点集之中}Node fromNode = graph.nodes.get(from);Node toNode = graph.nodes.get(to);fromNode.nexts.add(toNode);//加入到from的nexts集合中fromNode.out++;//fromNode出度++toNode.in++;//toNode入度++Edge edge = new Edge(weight, fromNode, toNode);//创建边graph.edges.add(edge);//加入到图的边集fromNode.edges.add(edge);//加入到fromNode点的边集中}return graph;}
}

图的遍历的注意点:二叉树无环、图有环(避免图的环导致代码死循环) 

 

宽度遍历:一层一层向下遍历,先遍历距离A最近的点,再遍历距离A隔了一层的节点

深度遍历:一条路走到死,再返回去看还有哪条路可以走

图的宽度遍历

如果确定节点的类型为数字,可以将哈希表写成数组结构用索引查找,可以节省时间

package graph;import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;public class Traversal {public static void widthTraversal(Node node) {if (node == null) {return;}HashSet<Node> hashSet = new HashSet();//放一个set防止重复把节点丢到队列里造成死循环Queue<Node> queue = new LinkedList();hashSet.add(node);queue.add(node);while (!queue.isEmpty()) {Node node0 = queue.poll();//从队列中弹出System.out.println(node0.value);//打印or执行操作for (Node node1 : node.nexts) {//遍历node的nexts的点集中的所有的点if(!hashSet.contains(node1)){//判断是否在set里面,是否出现过,防止环形结构死循环hashSet.add(node1);//如果没有,就放入set和队列中queue.add(node1);}}}}}

 

图的深度遍历

 

    public static void deepTraversal(Node node) {if (node == null) {return;}HashSet<Node> hashSet = new HashSet();//放一个set防止重复把节点丢到队列里造成死循环Stack<Node> stack = new Stack();hashSet.add(node);stack.add(node);System.out.println(node.value);while (!stack.isEmpty()) {Node node0 = stack.pop();for (Node node1 : node0.nexts) {if(!node0.nexts.contains(node1)){stack.push(node0);//node再重新入栈stack.push(node1);//邻居入栈hashSet.add(node1);//入set集合System.out.println(node1.value);break;}}}}

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

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

相关文章

SpringBoot集成-阿里云对象存储OSS

文章目录 阿里云 OSS 介绍准备工作SpringBoot 集成 OSS 阿里云 OSS 介绍 阿里云对象存储 OSS &#xff08;Object Storage Service&#xff09;&#xff0c;是一款海量、安全、低成本、高可靠的云存储服务。使用 OSS&#xff0c;你可以通过网络随时存储和调用包括文本、图片、…

【每日OJ题—— 142. 环形链表 II (链表)】

每日OJ题—— 142. 环形链表 II &#xff08;链表&#xff09; 1.题目&#xff1a;142. 环形链表 II 2.方法讲解2.1.解法一&#xff1a;2.1.1.图文解析2.1.2.代码实现2.1.3.提交通过展示 2.2解法二:2.2.1图文解析2.2.2代码实现2.2.3.提交通过展示 1.题目&#xff1a;142. 环形链…

从使用的角度看 ByConity 和 ClickHouse 的差异

自 ClickHouse Inc 宣布其重要新功能仅在 ClickHouse Cloud 上开放以来&#xff0c;一些关注 ByConity 开源的社区小伙伴也来询问 ByConity 后续开源规划。为回答社区疑问&#xff0c;我们将之前分享的关于 ByConity 与 ClickHouse 相关功能对比的 webinar 整理为文章&#xff…

AI 编程界的扛把子

大家好&#xff0c;我是伍六七。 全国最大 AI 社群《AI 破局俱乐部》初创合伙人。8 年 Java 经验&#xff0c;干过开发&#xff0c;也做过管理。目前在某互联网大厂从事 Java 开发&#xff0c;业余时间研究 AI 编程。 我从 2022 年底&#xff0c;ChatGPT 问世&#xff0c;就密…

【第28例】IPD体系进阶 | 需求管理:需求实现过程

目录 简介 内容详解 CSDN学院相关推荐 作者简介 简介 继续 IPD 体系中的需求管理相关的专题。 先来看看整个需求管理涉及的过程内容: 需求管理流程主要包含五个阶段: 需求收集; 需求分析; 需求分发/分配;

【Python报错合集】Python元组tuple、张量tensor(IndexError、TypeError、RuntimeError……)~持续更新

文章目录 IndexError1. tuple index out of rangea. 示例代码b.报错原因c.解决方案 TypeError1. len() of a 0-d tensora. 示例代码b.报错原因c.解决方案 RuntimeError1. output with shape … doesnt match the broadcast shape …a. 示例代码b.报错原因c.解决方案 2. Cant ca…

npm install:sill idealTree buildDeps

执行npm install&#xff0c;卡在 sill idealTree buildDeps PS D:\workspace-groovy\attendance-india-web> npm install -g cnpm --registryhttps://registry.npm.taobao.org [..................] / idealTree:node_global: sill idealTree buildDeps[.................…

Web3游戏的十字路口:沿用传统IP还是另起炉灶?

人们经常问我对 Web3 游戏有什么看法。因此&#xff0c;我想以书面形式概述一下我目前的想法。 让我先澄清一下&#xff1a;我不是专家。这不是一篇深入探讨游戏世界精细指标如 MAU 或 D14 等的全面分析。请把这看作是我根据个人交流和研究&#xff0c;这反映我在游戏领域关注…

响应式建筑房地产开发企业网站模板源码带后台

模板信息&#xff1a; 模板编号&#xff1a;5635 模板编码&#xff1a;UTF8 模板颜色&#xff1a;红色 模板分类&#xff1a;基建、施工、地产、物业 适合行业&#xff1a;房地产类企业 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0…

每天一点python——day61

#第61天 #字符串的驻留机制字符串&#xff1a;python中基本数据类型&#xff0c;是一个不可变的序列【目前我们学了两个&#xff1a;元组、字符串】 可以使用单引号&#xff0c;双引号&#xff0c;三引号来定义#定义字符串 apython#用单引号&#xff0c;双引号&#xff0c;三引…

如何解决msvcp140.dll文件丢失问题,msvcp140.dll丢失的解决方法

在使用电脑时&#xff0c;有时我们可能会遇到一些错误提示&#xff0c;比如“找不到msvcp140.dll文件”。这是因为某些程序需要依赖于msvcp140.dll文件才能正常运行。这个问题是可以解决的,大家不需要担心&#xff0c;而且其解决的方法是有很多种的&#xff0c;今天我们就来给大…

数据库系统原理与实践 笔记 #7

文章目录 数据库系统原理与实践 笔记 #7数据库设计和E-R模型(续)转换为关系模式具有简单属性的实体集的表示复合属性多值属性联系集的表示模式的冗余—合并 实体-联系设计问题设计问题联系属性的布局 扩展的E-R特性特化概化属性继承特化/概化的设计约束聚集E-R图表示方法总结E-…

利用Graviton2和S3免费套餐搭建私人网盘

网盘是一种在线存储服务&#xff0c;提供文件存储&#xff0c;访问&#xff0c;备份&#xff0c;贡献等功能&#xff0c;是我们日常中不可或缺的一种服务。很多互联网公司都为个人和企业提供免费的网盘服务。但这些免费服务都有一些限制&#xff0c;比如限制下载速度&#xff0…

网络运维Day06

文章目录 磁盘空间管理一块硬盘的“艺术”之旅识别磁盘分区规划分区模式MBR(主启动记录模式)GPT分区 使用GPT分区方案分区 格式化与挂载使用格式化挂载使用 实现开机自动挂载实验 光盘挂载交换空间 总结 磁盘空间管理 磁盘空间管理 扇区默认512字节 一块硬盘的“艺术”之旅 …

领星ERP如何无需API开发轻松连接OA、电商、营销、CRM、用户运营、推广、客服等近千款系统

领星ERP&#xff08;LINGXING&#xff09;是一款专业的一站式亚马逊管理系统&#xff0c;帮助卖家构建完整的数据化运营闭环。&#xff0c;致力于为跨境电商卖家提供精细化运营和业财一体化的解决方案。 官网&#xff1a;https://erp.lingxing.com 集简云无代码集成平台&…

[NLP] LlaMa2模型运行在Mac机器

本文将介绍如何使用llama.cpp在MacBook Pro本地部署运行量化版本的Llama2模型推理&#xff0c;并基于LangChain在本地构建一个简单的文档Q&A应用。本文实验环境为Apple M1 芯片 8GB内存。 Llama2和llama.cpp Llama2是Meta AI开发的Llama大语言模型的迭代版本&#xff0c;…

02-React组件与模块

组件与模块 前期准备 安装React官方浏览器调试工具&#xff0c;浏览器扩展搜索即可 比如红色的React就是本地开发模式 开启一个用React写的网站&#xff0c;比如美团 此时开发状态就变成了蓝色 组件也能解析出来 何为组件&模块 模块&#xff0c;简单来说就是JS代…

系统架构设计师(第二版)学习笔记----层次式架构设计理论与实践

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----层次式架构设计理论与实践 文章目录 一、层次式体系结构概述1.1 软件体系结构的作用1.2 常用的层次式架构图1.3 层次式体系可能存在的问题点 二、表现层框架设计2.1 MVC模式2.1.1 MVC三层模式2.1.2 MVC设…

Zookeeper3.7.1分布式安装部署

上传安装文件到linux系统上面 解压安装文件到安装目录 [zhangflink9wmwtivvjuibcd2e package]$ tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /opt/software/3. 修改解压文件名 [zhangflink9wmwtivvjuibcd2e software]$ mv apache-zookeeper-3.7.1-bin/ zookeeper-3.7…

用HTML + javaScript快速完成excel表格信息除重并合并

今天突然接到一个工作&#xff0c;要把两个存储在.xls的主体信息表&#xff0c;除重后合并成一个主体信息表&#xff0c;并且补充主体类型和所在县区这两列信息。 完成这项工作的方法有很多&#xff0c;如果信息表中的信息量不大的话&#xff0c;手工处理一下也行&#xff0c;如…