Путь максимальной длины в графе



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

Задача является NP-полной, поэтому используем перебор с возвратом.


Листинг C++

// maximum in vector < int >
int maximum (vector < int > &a)
{
    int m = - 1e9;
    for (int i = 0; i < a.size (); ++ i)
        m = max (m, a[i]);
    return m;
}
// maximal way from given vertices
void max_way_from_one (int x, vector < vector < int > > &D, 
              vector < int > &w, vector < int > &p, vector < int > &is)
{
    is[x] = 1;

    for (int i = 0; i < D.size (); ++ i)
        if (!is[i] && D[x][i])
        {
            vector < int > wt = w;
            vector < int > pt = p;
            w[i] = w[x] + D[x][i];
            p[i] = x;

            // recursion for next
            max_way_from_one (i, D, w, p, is);
            
            if (maximum (wt) > maximum (w))
            {
                w = wt;
                p = pt;
            }    
        }

    is[x] = 0;
}
// maximal way in the graf whose(way) incluse vertice only once
void max_way (vector < vector < int > > &D, 
              vector < int > &w, vector < int > &p)
{
    int i;
    int n = D.size ();
    int Max = - 1;

    for (i = 0; i < n; ++ i)
    {
        vector < int > wt (n, 0);
        vector < int > pt (n, - 1);
        vector < int > is (n, 0);

        max_way_from_one (i, D, wt, pt, is);

        int m = maximum (wt);

        if (m > Max)
        {
            Max = m;
            w = wt;
            p = pt;
        }
    }
}

19.05.2007, 14:50


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