排序时使用邻接矩阵与邻接列表

时间:2016-05-23 03:05:17

标签: java adjacency-matrix topological-sort

我想基于DFS方法实现拓扑排序:

import java.util.*;

public class TopologicalSort {

  static void dfs(List<Integer>[] graph, boolean[] used, List<Integer> res, int u) {
    used[u] = true;
    for (int v : graph[u])
      if (!used[v])
        dfs(graph, used, res, v);
    res.add(u);
  }

  public static List<Integer> topologicalSort(List<Integer>[] graph) {
    int n = graph.length;
    boolean[] used = new boolean[n];
    List<Integer> res = new ArrayList<>();
    for (int i = 0; i < n; i++)
      if (!used[i])
        dfs(graph, used, res, i);
    Collections.reverse(res);
    return res;
  }

  // Usage example
  public static void main(String[] args) {
    int n = 3;
    List<Integer>[] g = new List[n];
    for (int i = 0; i < n; i++) {
      g[i] = new ArrayList<>();
    }
    g[2].add(0);
    g[2].add(1);
    g[0].add(1);

    List<Integer> res = topologicalSort(g);
    System.out.println(res);
  }
}

但是我不确定在使用邻接矩阵而不是列表时实现方式有何不同。我把它存储为:

private Edge[][] adjMatrix;       // Adjacency matrix

如何使用邻接矩阵代替邻接列表,如第16,29行所示。

谢谢

1 个答案:

答案 0 :(得分:0)

在我看来,不需要更改该列表,无论如何都需要记录被访问顶点的发布顺序。

邻接矩阵将影响您遍历u的邻居顶点的方式,特别是此行for (int v : graph[u])需要更改为:

for (int v = 0; v < adjMatrix[u].length; v++) {
    if (adjMatrix[u][v] != null && !used(v))
    // If there exists an edge between (u, v), and haven't visited v yet.
    {
         dfs(adjMatrix, used, res, v); // visit v
    }
}