图的链式前向星存储与搜索

图的存储与搜索

链式前向星存储

图的存储方式有很多种,但是也都有各自的优缺点。例如:采用邻接矩阵的形式存储的时候,存储比较简单,但是遍历或者处理的时候就会比较浪费时间;而采用邻接表存储,则效率会有很大的提示,但是存储就比较麻烦。
而链式前向星存储类似于图的邻接表。我从百度上查到的是从前向星(也是一种存储图数据结构)优化而来的,它的存储也比较简单,效率也很快。当处理稠密图的时候可以选择使用邻接矩阵而当数据范围较大或者稀疏图的时候采用邻接表或者链式前向星就能很好的提高效率。
下边是它的代码实现以及解释。

int[] head; // head[i]存以为起点的最后一条边的下标(在中的下标)
int[] e; // e[i]存储第i条边的终点
int[] ne; // ne[i]存储的是与第i条边同起点的上一条边
int[] w; // w[i]存储的是第i条边的权值
public static void add(int a, int b, int c){
    // idx指的是第idx条边
    e[idx] = b; // 第idx边的终点是b
    w[idx] = c; // 权值是c
    ne[idx] = head[a]; 
    head[a] = idx ++; // 更新以a为起点的编号
}

完整的测试代码:

```java
package;

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    static final int N = 10010;
    static int[] head = new int[N], e = new int[N], ne = new int[N], w = new int[N];
    static int idx = 0;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Arrays.fill(head,-1);
        // 顶点个数
        int n = in.nextInt();
        // 边的个数
        int k = in.nextInt();
        for(int i = 0; i < k; i ++){
            int a = in.nextInt();
            int b = in.nextInt();
            int c = in.nextInt();
            add(a, b, c);
        }

        for(int i = 1; i <= n; i ++){
            for(int j = head[i]; j != -1; j = ne[j]){
                System.out.println("start:" + i + ",end:" + e[j] + ",w:" + w[j]);
            }
        }
    }
    public static void add(int a, int b, int c){
        e[idx] = b;
        w[idx] = c;
        ne[idx] = head[a];
        head[a] = idx ++;
    }
}

测试样例:

7 7
1 2 1
2 3 2
3 4 3
1 3 4
4 1 5
1 5 6
4 5 7

结果输出:

在这里插入图片描述

DFS

采用链式前向星存储的图的深度优先搜索。
深度优先搜索我就不过多解释,就是沿着一条路一直走下去,走不下去再回头取尝试别的路。

代码实现

    /**
     * 图的深度优先搜索
     * 以u为起点开始进行DFS
     * @param u
     */
    public static void dfs(int u){
        System.out.print(u + " ");
        st[u] = true; // 标记已经被访问过
        for(int i = head[u]; i != -1; i = ne[i]){
            int j = e[i];
            if(!st[j]) dfs(j);
        }
    }

结果输出:

以1为起点,进行DFS
在这里插入图片描述

BFS

图的广度优先搜索,借助队列来实现。
一层一层的遍历,可以用他来求路径固定的最短。

代码实现

    /**
     * 图的广度优先搜索
     * @param u
     */
    public static void bfs(int u){
        Queue<Integer> q = new ArrayDeque<>();
        q.add(u);
        st[u] = true;
        while(!q.isEmpty()){
            u = q.poll();
            System.out.print(u + " ");
            for(int i = head[u]; i != -1; i = ne[i]){
                int j = e[i];
                if(!st[j]) {
                    st[j] = true;
                    q.add(j);
                }
            }
        }
    }

结果输出:

以1为起点,进行BFS
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无需修改配置springboot启动多个不同端口的启动类

idea:2023 1.4版本 复制原先启动类&#xff0c;原先没有启动类&#xff0c;点击上方➕添加启动类 需要配置不同的端口号&#xff0c;其他默认 点击应用即可

ARM地址映射表

硬件控制原理 只有Load/start指令可以读写硬件控制器量的寄存器&#xff0c;从而操作硬件地址划分图如下(其中IO(SFR)用来操控硬件的)&#xff1a;注意&#xff1a;对于一个32位的处理器&#xff0c;里面的所有寄存器都是32位地址&#xff0c;所以范围位2的32次方&#xff0c;…

Tab组件的编写与动态日期的函数封装

src\components\Tab\Icon.vue 底部导航栏子组件。 <template><router-link :to"path" class"tab-icon"><i class"icon">{{iconText}}</i><p class"text"><slot>{{ tabText }}</slot></…

ModuleNotFoundError: No module named ‘sklearn.cross_validation‘

一、问题分析 ModuleNotFoundError: No module named sklearn.cross_validation 英文先翻译一遍&#xff0c;模块未找到问题&#xff0c;这里涉及到sklearn这个模块&#xff0c;Sklearn &#xff08;全称 SciKit-Learn&#xff09;&#xff0c;是基于 Python 语言的机器学习工…

【玩转Linux】有关Linux权限

目录 一.Linux权限的概念 1. 权限的本质 2.Linux中的用户 3.Linux中的权限管理 (1)文件访问者的分类 (2)文件类型和访问权限&#xff08;事物属性&#xff09; ①文件基本权限 ②文件权限值的表示方法 (3)文件访问权限的相关设置方法 ① 用 户 表 示 符 / - 权 …

Android14音频进阶:AudioTrack如何巧妙衔接AudioFlinger(五十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

GAN 网络的损失函数介绍代码

文章目录 GAN的损失函数介绍1.L1 losses2.mse loss3.smooth L14.charbonnier_loss5.perceptual loss (content and style losses)6.Gan损失7.WeightedTVLoss8.完整代码方便使用,含训练epoch代码。 GAN的损失函数介绍 1.L1 losses pixel_opt: type: L1Loss loss_weight: 1.0 r…

如何将视频内容转换为文字文稿?这三款工具助您实现视频转写!

在日常生活中&#xff0c;有时我们需要将视频中的内容转换为文字文稿以便于搜索、编辑或分享。但选择合适的视频转文字软件可能让人感到困惑。今天我将为您推荐三款优秀的视频转文字工具&#xff0c;它们操作简单、准确高效&#xff0c;能够帮助您快速完成视频内容转写的工作。…

C中的流程控制

顺序结构 自上而下逐条执行 选择结构 if if&#xff08;条件&#xff09;{执行语句1}else{执行语句2} if&#xff08;条件&#xff09;{执行语句1}else if{执行语句2}else{执行语句2} switch 根据条件直接跳转到位置处 格式 switch(表达式) { case 目标值1: 执行语句1 break;…

Java:继承

文章目录 每日一言1. 什么是继承&#xff1f;2. 子类怎么访问父类的成员变量&#xff1f;2.1 不同名的怎么访问&#xff1f;2.2 同名的怎么访问&#xff1f; 3. 子类怎么访问父类的成员方法&#xff1f;3.1 不同名的怎么访问&#xff1f;3.2 同名的怎么访问&#xff1f; 4. 如果…

吴恩达deeplearning.ai:决策树模型

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 猫分类例子学习过程 学习算法非常强大的原因之一&#xff0c;是其应用了决策树和树集合&#xff0c;尽管决策树取得了巨大的成功&#xff0c;但是在学术界却没有太多的研究&#x…

【机器学习】进阶学习:详细解析Sklearn中的MinMaxScaler---原理、应用、源码与注意事项

【机器学习】进阶学习&#xff1a;详细解析Sklearn中的MinMaxScaler—原理、应用、源码与注意事项 这篇文章的质量分达到了97分&#xff0c;虽然满分是100分&#xff0c;但已经相当接近完美了。请您耐心阅读&#xff0c;我相信您一定能从中获得不少宝贵的收获和启发~ &#x1f…

如何配置固定TCP公网地址实现远程访问内网MongoDB数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…

用了这些计费方式,代理IP成本减半

“代理IP在现代互联网环境中扮演着重要的角色&#xff0c;它们用于隐藏真实的网络地址&#xff0c;提供更安全和匿名的网络浏览体验。代理IP的成本一直是个令人头疼的问题。” 过去供应商常常采用固定费用的模式&#xff0c;客户无论使用时间长短都需要支付相同的费用&#xff…

[Mac软件]Adobe Illustrator 2024 28.3 intel/M1/M2/M3矢量图制作软件

应用介绍 Adobe Illustrator 是行业标准的矢量图形应用程序&#xff0c;可以为印刷、网络、视频和移动设备创建logos、图标、绘图、排版和插图。数以百万计的设计师和艺术家使用Illustrator CC创作&#xff0c;从网页图标和产品包装到书籍插图和广告牌。 绘制任意大小的标志 拥…

恒丰纸业携手得帆云,构建权威级企业主数据管理平台

本期客户 牡丹江恒丰纸业股份有限公司&#xff08;简称“恒丰纸业”&#xff09;是国内首家通过科技部和中科院认定的造纸行业重点高新技术企业&#xff0c;于2001年上海证交所上市交易。 恒丰纸业拥有70年历史底蕴和特种薄页纸研发制造技术&#xff0c;现有生产线21条&#xf…

白酒:勾兑技艺的科学原理与实践技巧

在白酒的酿造过程中&#xff0c;勾兑技艺是至关重要的一环。通过勾兑&#xff0c;酒庄能够将不同类型、不同年份的基酒进行优化组合&#xff0c;以获得理想的口感和品质。许多酒庄在勾兑技艺方面积累了丰富的实践经验&#xff0c;并不断探索科学原理&#xff0c;以提高勾兑技艺…

前端性能优化 | CDN缓存

前言 CDN&#xff08;Content Delivery Network&#xff09;是一种分布式的网络架构&#xff0c;通过在全球各地部署节点服务器来快速传输和分发网络内容。CDN的主要目标是提供快速、可靠的内容传输&#xff0c;以提升用户体验。 本文主要从以下方面讲解CDN 什么是CDNCDN的作…

同一交换机下不同网段的终端通信

文章目录 一个有趣的实验 大家都知道不同网段的IP地址要想通信需要通过网关进行路由转发&#xff0c;而一般通过路由器来做默认网关。 一个有趣的实验 一台二层交换机下&#xff0c;连接两个不同网段的PC&#xff0c;实现彼此之间的通信。 一台S3700交换机&#xff0c;两台PC。…

LabelImg:一个简单易用的图像标注工具

目录 LabelImg是什么&#xff1f; 如何使用LabelImg进行图像标注&#xff1f; LabelImg的优势和应用场景 在哪里下载它 随着人工智能技术的不断发展&#xff0c;机器学习和深度学习在图像识别、目标检测等领域中得到了广泛的应用。而要训练一个有效的模型&#xff0c;通常需…