Поиск мостов
Необходимо в заданном графе найти все мосты.
Мост - ребро графа, при удалении которого увеличивается количество компонентов связности.
В нашей реализации функция возвращает массив цветов вершин. Если две связанные вершины имеют различный цвет - это мост.
Асимптотика: если граф задан списком рёбер O(M + N), если матрицей смежности O(N2).
Листинг C++
void dfs_reverse (int &v, vector < vector < >int > > &D,
vector < int > &is, vector < int > &c)
{
is[v] = 1;
c.push_back (v);
for (int i = 0; i < D[v].size( ); ++ i)
if (is[i] == 0 && D[v][i])
{
D[v][i] = 0;
dfs_reverse (i, D, is, c);
}
}
void dfs_color (int &v, vector < vector < int > > &D,
vector < int > &col, int &c)
{
col[v] = c;
for (int i = 0; i < D[v].size (); ++ i)
if (col[i] == 0 && D[v][i])
dfs_color (i, D, col, c);
}
void bridge (vector < vector < int > > D, vector < int > &col)
{
int i, j;
int n = D.size ();
vector < int > is (n, 0);
vector < int > c;
// ориентируем наш граф в сторону, из которой идём
for (i = 0; i < n; ++ i)
if (is[i] == 0)
dfs_reverse (i, D, is, c);
// красим вершины орграфа
col.assign (n, 0);
int color = 0;
for (i = 0; i < c.size (); ++ i)
if (col[c[i]] == 0)
{
++ color;
dfs_color (c[i], D, col, color);
}
}
01.06.2007, 14:57
По всем вопросам обращаться: rumterg@gmail.com