Здравствуйте, Neuroshifter, Вы писали:
N>Ламерский вопрос =).
N>Стоит задача перебрать все возможные графы с количеством вершин N и кол-вом ребер не больше (N^3)/2.Во как. Нужен алгоритм..=)
Можно переформулировать — всевозможные матрицы N*N с суммой эл-тов (N^3)/2..
Здравствуйте, Neuroshifter, Вы писали:
N>Ламерский вопрос =).
N>Стоит задача перебрать все возможные графы с количеством вершин N и кол-вом ребер не больше (N^3)/2.Во как. Нужен алгоритм..=)
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, Neuroshifter, Вы писали:
N>>Ламерский вопрос =).
N>>Стоит задача перебрать все возможные графы с количеством вершин N и кол-вом ребер не больше (N^3)/2.Во как. Нужен алгоритм..=)
M>А изоморфные графы считать разными?
Здравствуйте, Neuroshifter, Вы писали:
N>>>Стоит задача перебрать все возможные графы с количеством вершин N и кол-вом ребер не больше (N^3)/2.Во как. Нужен алгоритм..=)
M>>А изоморфные графы считать разными?
N>Да.
Кстати, количество ребер в полном графе из N вершин равно N*(N-1)/2, что всегда меньше чем N^3/2. Может быть имеется в виду мультиграф? Или ориентированный мультиграф?
Еще уточнение.
Конечно же, я имел в виду мультиграфы.
Для просто-графов (орграфов) есть ограничение: в урне (кроме фиктивной) может быть не более одного шарика.
Меняем алгоритм.
class Perebor
{
...
virtual int L(int m) const; // лимит количества шаров в урне #m ( = 1 )void start()
{
put(0, K()); // фиктивная урна - номер 0
// или, если фиктивная урна - номер M() или ее вообще нетfor(int m=0; m<M() && k > 0; ++m) // раскидать по первым урнам
{ int kk = (k >= L(m)) ? L(m) : k;
put(m, kk);
k -= k;
}
}
bool next()
{
int m;
for(m=M()-2; m>=0 && !(at(m)>0 && at(m+1)<L(m+1)); --m) // ищем пару из заполненной и (полу)пустойif(m < 0) return false; // конец
put(m, at(m) -1);
put(m+1, at(m+1)+1);
print();
return true;
}
}
M>Кстати, количество ребер в полном графе из N вершин равно N*(N-1)/2, что всегда меньше чем N^3/2. Может быть имеется в виду мультиграф? Или ориентированный мультиграф?
Да, и мультиграф тоже.