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