Мне дали задание написать код, который берет список узлов из графа и определяет, находятся ли они в правильном топологическом порядке.
Граф представляется в памяти следующим образом:
typedef struct graph_t* Graph;
typedef struct node_t* Node;
struct node_t {
int id;
/*incoming edges*/
Linked_list incoming;
/*outgoing edges*/
Linked_list outgoing;
};
struct graph_t {
int order;
int size;
Node nodes;
};
Для краткости я опустил реализацию связанного списка, но это всего лишь стандартная реализация связанного списка.
Мне также дали следующий алгоритм (псевдокод):
L <- topologically sorted list of nodes
V <- empty list of visited nodes
for each node n in L do
add n to V
for each node m reachable from n do
if m in V then L is not sorted
Я понимаю определение топологического порядка, но я не понимаю, как и почему это может подтвердить топологический порядок.
Насколько этот алгоритм верен? Кроме того, учитывая приведенное выше представление графика, как будет реализована линия for each node m reachable from n do
?
Кроме того, есть ли лучший алгоритм, чем приведенный выше, для выполнения этой задачи?