Топологическая сортировка: различия между версиями

Материал из Олимпиадное программирование в УлГТУ
Перейти к навигации Перейти к поиску
Нет описания правки
Строка 2: Строка 2:
* Каждую вершину при выходе из DFS кладём в контейнер, который после переворачиваем (также можно использовать стек).
* Каждую вершину при выходе из DFS кладём в контейнер, который после переворачиваем (также можно использовать стек).


  vector<int> g[V_CNT];
  vector<vector<int>> g(n);
  bool u[V_CNT];
  vector<bool> visited(n);
  vector<int> order;
  vector<int> order;
   
   
  void dfs(int v) {
  void dfs(int v) {
     u[v] = 1;
     visited[v] = 1;
     for (int i = 0; i < g[v].size(); i++)
     for (int to : g[v])
         if (!u[g[v][i]])
         if (!visited[to])
             dfs(g[v][i]);
             dfs(to);
     order.push_back(v);
     order.push_back(v);
  }
  }
   
   
  for (int i = 0; i < V_CNT; i++)
  for (int v = 0; v < n; v++)
    u[i] = 0;
     if (!visited[v])
for (int i = 0; i < V_CNT; i++)
         dfs(v);
     if (!u[i])
         dfs(i);
  reverse(order.begin(), order.end());
  reverse(order.begin(), order.end());


Строка 28: Строка 26:
* [http://e-maxx.ru/algo/topological_sort e-maxx.ru &mdash; Топологическая сортировка]
* [http://e-maxx.ru/algo/topological_sort e-maxx.ru &mdash; Топологическая сортировка]
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B0_%D0%B2_%D0%B3%D0%BB%D1%83%D0%B1%D0%B8%D0%BD%D1%83_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D0%BF%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8 neerc.ifmo.ru/wiki &mdash; Использование обхода в глубину для топологической сортировки]
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BE%D0%B1%D1%85%D0%BE%D0%B4%D0%B0_%D0%B2_%D0%B3%D0%BB%D1%83%D0%B1%D0%B8%D0%BD%D1%83_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D0%BF%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8 neerc.ifmo.ru/wiki &mdash; Использование обхода в глубину для топологической сортировки]
* [http://brestprog.neocities.org/lections/topsort.html brestprog.neocities.org &mdash; Топологическая сортировка]
* [http://brestprog.by/topics/topsort/ brestprog Топологическая сортировка]
* [http://algorithmica.org/tg/dfs-plus algorithmica.org — Продвинутый DFS]
* [http://algorithmica.org/tg/dfs-plus algorithmica.org — Продвинутый DFS]
* [http://informatics.mccme.ru/course/view.php?id=6 informatics.mccme.ru &mdash; Курс &laquo;Алгоритмы на графах&raquo; &mdash; часть 2]
* [http://informatics.mccme.ru/course/view.php?id=6 informatics.mccme.ru &mdash; Курс &laquo;Алгоритмы на графах&raquo; &mdash; часть 2]

Версия от 15:52, 15 февраля 2020

  • Порядок топологической сортировки — порядок убывания времени выхода из вершины.
  • Каждую вершину при выходе из DFS кладём в контейнер, который после переворачиваем (также можно использовать стек).
vector<vector<int>> g(n);
vector<bool> visited(n);
vector<int> order;

void dfs(int v) {
    visited[v] = 1;
    for (int to : g[v])
        if (!visited[to])
            dfs(to);
    order.push_back(v);
}

for (int v = 0; v < n; v++)
    if (!visited[v])
        dfs(v);
reverse(order.begin(), order.end());

Ссылки на задачи

Ссылки