【问题标题】:Adjacency List Representation in Topological Sort拓扑排序中的邻接表表示
【发布时间】:2019-07-25 07:05:26
【问题描述】:

我在 Leetcode https://leetcode.com/problems/course-schedule/discuss/58509/18-22-lines-C++-BFSDFS-Solutions 上看到了下面使用 DFS 实现的拓扑排序

现在让我感到困惑的部分是用于顶级排序的有向图的表示。图表创建如下:

vector<unordered_set<int>> make_graph(int numCourses, vector<pair<int, int>>& prerequisites) {
    vector<unordered_set<int>> graph(numCourses);
    for (auto pre : prerequisites)
        graph[pre.second].insert(pre.first);
    return graph;
}

让我困惑的是这一行:

    graph[pre.second].insert(pre.first);

大概图被表示为一个邻接表;如果是这样,为什么每个节点都由传入边而不是传出边表示?有趣的是,如果我像这样翻转 pre.second 和 pre.first:

graph[pre.first].insert(pre.second);

顶级排序仍然有效。但是,似乎大多数相同问题的实现都使用前一种方法。这是否适用于所有有向图?我在本科学位中被教导,有向图的邻接列表应该包含每个节点传出节点的列表。对于邻接表的表示,输入节点和输出节点的选择是任意的吗?

【问题讨论】:

    标签: c++ algorithm data-structures graph-theory topological-sort


    【解决方案1】:

    对于只需要回答truefalse的具体问题,是否翻转所有边缘都没有关系。这是因为一个图是拓扑可排序的当且仅当它没有循环。但是,如果您想要订购,它不起作用,正如您在 [[0, 1]][[1, 0]] 的不同结果中看到的那样。

    保存图表的方式取决于您解决问题的方式。在这个给定的情况下,我们需要知道每个节点(课程)的入度,并且每次我们从图中删除一个节点(学习课程)时更新它,以便我们知道我们是否可以删除一个节点(我们可以当入度为 0 时执行此操作)。更新时,我们对删除节点指向的每个节点减 1。如果您应用此方法(大多数人都这样做),那么您应该如何保存图表就很清楚了

    【讨论】:

    • 如果您反转向量或使用 LIFO 结构,该解决方案确实会生成正确的拓扑排序。
    猜你喜欢
    • 2023-01-19
    • 2016-04-13
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多