Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Построить гамильтонову цепь в графе, используя нерекурсивный алгоритм(c++ или Delphi)

32K
21 октября 2007 года
Vladimir_sp
2 / / 21.10.2007
Помогите хотя бы разобраться в алгоритме следующей задачи, кодить я сам впринципе смогу, если буду иметь хорошее представление:

Построить гамильтонову цепь в графе, используя нерекурсивный алгоритм генерации всех перестановок вершин в лексикографическом порядке

Если кто-то может помочь с листингом, то нет разницы на чем он будет написан - С++ или Object Pascal, в консольном исполнении или в "графическом".

1. Я так понимаю имеется у нас, допустим, граф G =(V,X), где V = {v1 ,v2 ,…,vn}. Ищем в нем Гамильтонову цепь методом перебора всевозможных перестановок vi1 ,vi2 ,…,vin множества V. Для каждой из них проверяем, является ли vi1vi2…vin маршрутом в G. Если является, то vi1vi2 …vin - гамильтонова цепь в G, в противном случае переходим к другой перестановке.

2. Здать граф думаю стоит с помощью матрицы.

3. В лексикографическом порядке - это, например:
множества X = {1,2,3} будет:
123, 132, 213, 231, 312, 321

4. Нерекурсивный - значит не использовать функций вызывающих себя из себя же.

В общем пока каша в голове. Кто сможет, помогите разобраться...
247
22 октября 2007 года
wanja
1.2K / / 03.02.2003
Есть такая штука - возвратный алгоритм.
32K
22 октября 2007 года
Vladimir_sp
2 / / 21.10.2007
Да, вот нашел такой алгоритм, но он реализован рекурсивно. К тому же мне нужен не он, а нерекурсивный алгоритм генерирования всех перестановок вершин в лексикографическом порядке.
Вот что-то похожее, но даже не знаю пока это преобразовать:


Код:
Процедура находит перестановку, следующую за данной  в  лексикографическом
порядке. Начальная перестановка задается в массиве X, туда же после работы
процедуры помещается найденная перестановка.

Скажем, для N равного 3 существуют шесть перестановок:

    №1: 1 2 3
    №2: 1 3 2
    №3: 2 1 3
    №4: 2 3 1
    №5: 3 1 2
    №6: 3 2 1

Входные параметры:
    N   -   число элементов
    X   -   массив с нумерацией элементов [1..N]
            входная перестановка. Содержит числа от 1 до N.
           
Выходные параметры:
    X   -   массив с нумерацией элементов [1..N]
            перестановка, следующая за поданной на вход

Результат:
    True,  если  процедура  успешно  завершена  и  X  содержит   следующую
    перестановку.

    False, если X является последней перестановкой или процедуре  переданы
    неверные параметры (не являющиеся числами от 1 до N).
*************************************************************************/
bool nextpermutation(ap::integer_1d_array& x, const int& n)
{
    bool result;
    int k;
    int t;
    int y;

   
    //
    // Check
    //
    if( n<=0 )
    {
        result = false;
        return result;
    }
    for(k = 1; k <= n; k++)
    {
        if( x(k)<1||x(k)>n )
        {
            result = false;
            return result;
        }
    }
   
    //
    // Process
    //
    k = n-1;
    while(k>0)
    {
        if( x(k)<=x(k+1) )
        {
            break;
        }
        k = k-1;
    }
    if( k!=0 )
    {
        t = k+1;
        while(t<n)
        {
            if( x(t+1)<=x(k) )
            {
                break;
            }
            t = t+1;
        }
        y = x(k);
        x(k) = x(t);
        x(t) = y;
        t = 0;
        while(t<(n-k)/2)
        {
            y = x(n-t);
            x(n-t) = x(k+1+t);
            x(k+1+t) = y;
            t = t+1;
        }
        result = true;
    }
    else
    {
        result = false;
    }
    return result;
}



Может кто хорошо разбирается в этом?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог