Поиск точек сочленения



Необходимо в заданном графе найти все точки сочленения
Точка сочленения - вершина графа, при удалении которой увеличивается количество компонент связности.
Наша реализация возвращает булевский массив, содержащий информацию, является ли вершина точкой сочленения.

Асимптотика O(M + N).

Листинг

int timer;
vector < int > d;
vector < int > up;
vector < int > used;
vector < int > child;
void dfs_cp (int &v, vector < vector < int > > &e, vector < int > &is)
{
    used[v] = 1;
    ++ timer;
    d[v] = timer;
    up[v] = timer;

    int i;
    for (i = 0; i < e[v].size (); ++ i)
    {
        int to = e[v][i];

        if (used[to] == 0)
        {
            ++ child[v];
            dfs_cp (to, e, is);

            up[v] = min (up[v], up[to]);
            if (up[to] >= d[v])
                is[v] = 1;
        }
        else
            up[v] = min (up[v], d[to]);
    }
}
void cut_points (vector < vector < int > > &e, vector < int > &is)
{
    int i, j;
    int n = e.size ();
    is.assign (n, 0);
    
    timer = 0;
    d.assign (n, 0);
    up.assign (n, 0);
    used.assign (n, 0);
    child.assign (n, 0);

    for (i = 0; i < n; ++ i)
        if (used[i] == 0)
        {
            dfs_cp (i, e, is);
            is[i] = (child[i] > 1);
        }
}

31.08.2008, 16:26



По всем вопросам обращаться: rumterg@gmail.com