在面对图的算法例如遍历、拓扑排序,最短路径时,我们常常会觉得非常麻烦,不过算法本身并不算难,难的是它的存储方式。一般来说,常用的图的存储方式有邻接矩阵和邻接表两种,那么如果我们只掌握了邻接矩阵存储时的各算法,在面对给出的邻接表结构时就会变得难以下手,反之亦然,因此来分享一种很全面的图类,能够很好的解决问题,思路来源于左程云左神
首先我们来看图的结构,无论是有向图还是无向图,都由边集和点集构成,代码如下👇:
public class Graph {
public HashMap<Integer, Node> nodes;
public HashSet<Edge> edges;
public Graph()
{
nodes = new HashMap<Integer, Node>();
//nodes的哈希表结构中,key是节点编号,Node是节点本身
edges = new HashSet<Edge>();
}
}
再来看边和点的定义分别是怎样的,边的定义如下👇:
public 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;
}
}
点的定义如下👇:
public class Node {
public int value;
public int in; //入度
public int out; //出度
public ArrayList<Node> nexts; //相邻点集
public ArrayList<Edge> edges; //以它为出发点的边集
public Node(int val)
{
this.value = val;
this.in = 0;
this.out = 0;
nexts = new ArrayList<Node>();
edges = new ArrayList<Edge>();
}
}
将图以这样的方式表达之后,再需要写图的算法就会相对简单,在面对不同存储条件下的图结构时,可以将其自己转化为以上图的结构,这样准备好的算法代码皆能够在一个转换接口的帮助下应用于任何场合。