Я видел следующую реализацию топологической сортировки с использованием DFS на Leetcode https://leetcode.com/problems/course-schedule/discuss/58509/18-22-lines-C++-BFSDFS-Solutions
Что меня смущает, так это представление ориентированного графа, которое используется для верхней сортировки. График создается следующим образом:
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);
Верхний сорт все еще работает. Однако, похоже, что в большинстве реализаций той же проблемы используется первый метод. Распространяется ли это на все ориентированные графы? В бакалавриате меня учили, что список смежности ориентированного графа должен содержать список исходящих узлов каждого узла. Является ли выбор входящего и исходящего узла произвольным для представления списка смежности?