用栈和队列结构实现图的相关算法
1.图的节点基本结构
定义图的基本结点类型,每个节点包括四个属性:
in代表当前节点的入度
out 代表当前节点的出度
nexts存储的是当前结点指向的结点的集合
edge存储的是当前节点的邻接边的集合
import java.util.ArrayList;
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 = new ArrayList<>();
}
}
2. 图的边的基本属性
定义图中的每一条边有三个属性。分别是权值,from节点以及to节点
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;
}
}
3. 图的基本结构类型
每一个图有两个基本属性,这里分别用Map和Set来表示
1.nodes存储的是图中结点,map中的key代表节点的编号,value代表实际的node,类型是上面定义的Node类型。
2.edges代表图中所有边的集合,类型是上面定义的Edge类型。
import java.util.HashMap;
import java.util.HashSet;
public class Graph {
public HashMap<Integer,Node> nodes;//k是点的编号,v是实际的node
public HashSet<Edge> edges;//边集
public Graph() {
nodes = new HashMap<>();
edges = new HashSet<>();
}
}
4.如果根据一个二维数组来生成一张图
根据上面的定义表示,任何一条边都有三个属性,分别是权值以及相连接的两个结点,所有该矩阵表示成N行三列。
public class GraphGenerator {
//传入一个二维矩阵,生成一张图n行3列,有多少条边就有多少行
public static Graph createGraph(Integer[][] matrix) {
Graph graph = new Graph();
for (int i = 0; i < matrix.length; i++) {
Integer weight = matrix[i][0];// 第一列的值为权值
Integer from = matrix[i][1];// 第二列为from结点
Integer to = matrix[i][2];// to结点
if (!graph.nodes.containsKey(from)) {
graph.nodes.put(from, new Node(from));
}
if (!graph.nodes.containsKey(to)) {
graph.nodes.put(to, new Node(to));
}
// 拿出相连的两个结点,建出边
Node fromNode = graph.nodes.get(from);
Node toNode = graph.nodes.get(to);
Edge newEdge = new Edge(weight, fromNode, toNode);
fromNode.nexts.add(toNode);
fromNode.out++;// 出度加1
toNode.in++;// 入度加一
fromNode.edges.add(newEdge);
graph.edges.add(newEdge);
}
return graph;
}
}
- 在实际应用中的图一般都表示成上面定义的类型这种结构具有通用性,在后面的遍历算法和最小生成树以及最短路径中都会使用这种图的定义结构 *