原视频链接:https://www.bilibili.com/video/BV1254y1976m.
有向图的实现(Directed Graph)
有向图的实现有两种,一种是用矩阵(Matrix)的形式来实现,另一种是用链表(List)的形式来实现。
如果我们使用矩阵来实现有向图,来看一个例子:
每行代表相应的顶点,如果M[i][j] = 1,那么就代表顶点 i 连向 j,如果是0,则表达顶点间没有联系。用矩阵的方式来实现图的优势很明显,我们可以很快地判断两个顶点之间是否相连,可是用矩阵实现的时间复杂度很高,我们需要O(V^2)来记录所有的数据,不管顶点之间是否有相连线。为了解决时间复杂度的问题,我们可以使用链表的方式来实现图:
在链表实现中,我们实际上使用了储存链表的数组来表示图,图的左侧用数组来实现,代表我们的所有顶点,而每个顶点含有一个链表,链表上储存了该顶点指向的顶点。以下是Java的实现代码:
这是邻接表数组的数据结构代码:
import java.util.ArrayList;
public class ListGraph {
ArrayList<ArrayList<Integer>> graphs;//定义一个邻接表数组graphs
//ArrayList(此处是顶点)<ArrayList<Integer>(此处是顶点连接的链表)>
public ListGraph(int v) {
//有参构造方法 ,v是顶点的数量
graphs = new ArrayList<>(v);
for (int i = 0; i < v; i++) {
graphs.add(new ArrayList<>());//给每个顶点连接一个链表,构成邻接表这一数据结构。
}
}
public void addEdge(int start, int end) {
//添加一条从start到end的边
graphs.get(start).add(end);//
}
public void removeEdge