Компоненты сильной связности. Алгоритм Косараю-Шарира: различия между версиями

Материал из Олимпиадное программирование в УлГТУ
Перейти к навигации Перейти к поиску
Нет описания правки
Строка 1: Строка 1:
* Упорядочиваем вершины по убыванию времени выхода (как при топологической сортировке).
* Транспонируем граф.
* Обходим вершины транспонированного графа в порядке убывания времени выхода ("порядке топологической сортировки").
vector<int> g[V_CNT], gR[V_CNT];
int u[V_CNT];
vector<int> order;
void dfs1(int v) {
    u[v] = 1;
    for (int i = 0; i < g[v].size(); i++)
        if (!u[g[v][i]])
            dfs1(g[v][i]);
    order.push_back(v);
}
void dfs2(int v, int k) {
    u[v] = k;
    for (int i = 0; i < gR[v].size(); i++)
        if (!u[gR[v][i]])
            dfs2(gR[v][i], k);
}
for (int i = 0; i < V_CNT; i++)
    u[i] = 0;
for (int i = 0; i < V_CNT; i++)
    if (!u[i])
        dfs1(i);
reverse(order.begin(), order.end());
for (int i = 0; i < V_CNT; i++)
    u[i] = 0;
int k = 1;
for (int i = 0; i < V_CNT; i++)
    if (!u[order[i]])
        dfs2(order[i], k++);
== Ссылки ==
== Ссылки ==
* [http://e-maxx.ru/algo/strong_connected_components e-maxx.ru &mdash; Поиск компонент сильной связности, построение конденсации графа]
* [http://e-maxx.ru/algo/strong_connected_components e-maxx.ru &mdash; Поиск компонент сильной связности, построение конденсации графа]

Версия от 19:14, 1 октября 2014

  • Упорядочиваем вершины по убыванию времени выхода (как при топологической сортировке).
  • Транспонируем граф.
  • Обходим вершины транспонированного графа в порядке убывания времени выхода ("порядке топологической сортировки").
vector<int> g[V_CNT], gR[V_CNT];
int u[V_CNT];
vector<int> order;

void dfs1(int v) {
    u[v] = 1;
    for (int i = 0; i < g[v].size(); i++)
        if (!u[g[v][i]])
            dfs1(g[v][i]);
    order.push_back(v);
}

void dfs2(int v, int k) {
    u[v] = k;
    for (int i = 0; i < gR[v].size(); i++)
        if (!u[gR[v][i]])
            dfs2(gR[v][i], k);
}

for (int i = 0; i < V_CNT; i++)
    u[i] = 0;
for (int i = 0; i < V_CNT; i++)
    if (!u[i])
        dfs1(i);
reverse(order.begin(), order.end());
for (int i = 0; i < V_CNT; i++)
    u[i] = 0;
int k = 1;
for (int i = 0; i < V_CNT; i++)
    if (!u[order[i]])
        dfs2(order[i], k++);

Ссылки