Поиск Эйлерова цикла
Необходимо в неориентированном графе найти цикл, проходящий по всем рёбрам, посещая каждое ровно один раз
Если граф ориентирован, то строка D[i][v] = 0; не нужна.
Асимптотика: если граф представлен списком рёбер O(M), если матрицей смежности - O(N2).
Листинг C++
void search_euler (int v, vector < vector < int > > &D, vector < int > &c)
{
for (int i = 0; i < D[v].size (); ++ i)
if (D[v][i]) // если ребро есть
{
// проходим по нему
D[v][i] = 0;
D[i][v] = 0;
search_euler (i, D, c);
}
c.push_back (v);
}
void euler (vector < vector < int > > D, vector < int > &c)
{
int i, j;
int n = D.size ();
c.clear ();
// вычисляем степени вершин
vector < int > degree (n, 0);
for (i = 0; i < n; ++ i)
for (j = 0; j < n; ++ j)
if (D[i][j])
++ degree[i];
// проверяем существует ли в данном графе эйлеров цикл
int count = 0; // количество степеней не кратных двум
j = 0; // начальная вершина
for (i = 0; i < n; ++ i)
if (degree[i] % 2 != 0)
{
++ count;
if (count > 2)
return;
j = i;
}
// находим цикл, проходящий по всем рёбрам только один раз
search_euler (j, D, c);
}
01.06.2007, 14:41
По всем вопросам обращаться: rumterg@gmail.com