一文帮你创建一个属于自己的图结构!

1、背景描述

在做算法题的过程中,有时候会遇到图结构,但是有一些题目并不会直接把图创建好,而是只给出几个数组,并告知各元素的含义,然后就抛出问题要求解答。针对此种条件,数组中的元素往往包含着诸如图的节点、边、边的权值和方向等信息,如果能够在求解具体问题之前,正确解读并利用这些信息,创建出来一张图结构,便能够对后面的求解过程起到推波助澜的作用。本文便是根据此种场景提供了一种建图的方法。题目描述如下:

给定一个 N * 3 的 int 类型二阶矩阵 matrix ,矩阵的行代表了图的每一条边,列依次代表该边的三个信息:权重、起始节点值、终止节点值。据此,创建出一个完整的图。

2、题目分析

由题目描述可以知道,这是一个有向图,并且还带权重。我们知道对于一个图结构,最典型的结构要素就是节点和边,因此不妨先对这两个部分做个剖析,看看节点和边中又分别包含哪些具体要素,而后再来看看这些部分是如何串联起一张图来的。

3、搭建外壳——节点、边、图结构的创建过程

首先对于有向图的节点来说,只要是一个节点,那么它就必然包含一个value信息,再者由于连通节点的有向边会由此节点出发或者通往此节点,因此节点上还应该包含着一个入度信息in和一个出度信息out。此外,要想解释清楚整张图的连通状态,势必需要知道每个节点下面都连通着哪个节点(List < Node >),通过哪些边来连通的(List < Edge >),由于一个节点下可能连通着多个节点,因此这两个连接信息我们分别选用一个ArrayList集合来进行存储。节点结构代码如下:

// Node structure
public 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 
好的,我了解了,下面是对于 Kotlin 协程的使用的简要介绍: Kotlin 协程是一种轻量级的并发编程工具,它利用异步非阻塞的方式来提高应用程序的并发性能。在 Kotlin 中,协程提供了一个简单易用的 API 来实现异步操作,这使得编写异步代码变得更加容易。下面是 Kotlin 协程的使用方法: 1.导入协程库 在 Kotlin 中使用协程需要导入协程库。可以在 build.gradle 文件中添加以下代码: ```kotlin dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:version" } ``` 其中 version 是协程库的版本号。 2.创建协程 在 Kotlin 中,可以使用 `launch` 函数创建一个协程。以下是一个简单的例子: ```kotlin fun main() { GlobalScope.launch { delay(1000) println("World!") } println("Hello,") Thread.sleep(2000) } ``` 在这个例子中,我们使用 `launch` 函数创建了一个协程,它会在 1 秒后输出 "World!"。在这个协程中,我们使用了 `delay` 函数来模拟一些耗时的操作。在主线程中,我们输出了 "Hello,"。最后,我们使用 `Thread.sleep` 函数等待协程执行完毕。 3.协程作用域 在创建协程时,可以指定协程的作用域。例如,可以使用 `runBlocking` 函数创建一个协程作用域,这个作用域会阻塞当前线程直到所有协程执行完毕。以下是一个例子: ```kotlin fun main() = runBlocking<Unit> { val job = launch { delay(1000) println("World!") } println("Hello,") job.join() } ``` 在这个例子中,我们使用 `runBlocking` 函数创建了一个协程作用域。在这个作用域中,我们创建了一个协程,它会在 1 秒后输出 "World!"。在主线程中,我们输出了 "Hello,"。最后,我们使用 `join` 函数等待协程执行完毕。 4.协程取消 在协程执行过程中,可以通过调用 `cancel` 函数来取消协程。例如,以下是一个例子: ```kotlin fun main() = runBlocking<Unit> { val job = launch { repeat(1000) { i -> println("I'm sleeping $i ...") delay(500) } } delay(1300) println("main: I'm tired of waiting!") job.cancel() job.join() println("main: Now I can quit.") } ``` 在这个例子中,我们创建了一个协程,它会重复执行一些操作。在主线程中,我们等待协程执行了 1.3 秒后,取消了协程。最后,我们等待协程执行完毕并输出一些信息。 这就是 Kotlin 协程的基本使用方法。当然,这只是冰山一角,协程还有很多高级用法,例如协程间通信、异常处理等等。如需了解更多信息,请参考 Kotlin 官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值