Поиск Гамильтонова цикла



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

Задача о поиске Гамильтонова цикла является NP-полной поэтому используем полный перебор.
Асимптотика O(N*N!).

Листинг C++

bool hamilton (vector < vector < int > > &D, vector < int > &p)
{
    int i, j;
    int n = D.size ();
    for (i = 0; i < n; p.push_back (i), ++ i);

    // полный перебор всех цепочек длины n
    do
    {
        for (i = 0; i < n && D[p[i]][p[(i + 1) % n]] != 0; ++ i);
        if (i >= n) return 1;
    }
    while (next_permutation (p.begin (), p.end ()));

    return 0;
}

01.06.2007, 14:53


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