Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Прошу помочь


Автор: Dars2 21.5.2006, 10:54
Следующая проблема:
 
Нужен алгоритм нахождения критического (длиннейшего) пути в орграфе от самой первой вершины до последней (от 0 до m-1), представленного в виде матрицы m x m типа:
Код

{
{-Inf, 0,-Inf, -Inf, 0, -Inf, -Inf, 0, -Inf, -Inf, -Inf},
{-Inf, -Inf,10, -Inf, -Inf, -Inf, -Inf, -Inf,10, -Inf, -Inf},
{-Inf, -Inf,-Inf, 8,8, -Inf, -Inf, -Inf, -Inf, -Inf, -Inf},
{-Inf, -Inf,-Inf, -Inf, -Inf, -Inf, -Inf, -Inf, -Inf, 4, 4},
{-Inf, -Inf,-Inf, -Inf, -Inf, 5, -Inf, -Inf, -Inf, -Inf, -Inf},
{-Inf, -Inf,-Inf, -Inf, -Inf, -Inf, 5, -Inf, -Inf, -Inf, -Inf},
{-Inf,6,-Inf, -Inf, -Inf, -Inf, -Inf, -Inf, -Inf, -Inf, 6},
{-Inf, -Inf,4, -Inf, -Inf, -Inf, -Inf, -Inf, 4, -Inf, -Inf},
{-Inf, -Inf,-Inf, -Inf, -Inf, -Inf, -Inf, -Inf, -Inf, 7, -Inf},
{-Inf, -Inf,-Inf, -Inf, -Inf,3, -Inf, -Inf, -Inf, -Inf, 3},
{-Inf, -Inf,-Inf, -Inf, -Inf, -Inf, -Inf, -Inf, -Inf, -Inf, -Inf}}

Вышеприведенный пример представляет собой ориентированный граф, внутри которого есть циклы (цикл путь: 2-3-5-6-7-2). Поэтому стандартный алгоритм нахождения критического пути не работает. Необходимо сделать так чтобы он искал длиннейший путь, при это не заходя в уже посещенные вершины. На данный момент есть следующий код, но он не похоже не работает при зацикливании:
Код

void Topological_Sort () //Процедура топологической сортировки
{
    int Children[n];
    int index=n-1;
    {for (int v=0; v<n; v++) Children[v]=0;}
    {for (int v=0; v<n; v++)
        for (int v2=0; v2<n; v2++)
            if (graph[v][v2]!=Inf && v2!=v) Children[v]++;}

    bool found;
    do {
        found=false;
        for (int v=0; v<n; v++)
            if (!Children[v]) {
                for (int p=0; p<n; p++) if (graph[p][v]!=Inf) Children[p]--;
                Children[v]=1;
                Order[index--]=v;
                found=true;
                break;
            }
    } while (found);
}

int dist(int s, int d) //Процедура для подсчета длины длиннейшего пути в графе
//Мы принимаем, что есть только одна начальная и одна конечная вершина,  и нам необходимо найти длиннейший путь
{
    //1 - Делаем топологическую сортировку множества вершин: V->Order[]
    Topological_Sort();
    //Первая будет все время в Order[0], тогда как последняя в Order[n-1]

    //2 - Используем техничку динамического программирования
    //  Rule: Dist[d]=max{Dist[v]+graph[v][d], (v,d) in E}
    int Dist[n];

    int v;
    {for (int v=0; v<n; v++) Dist[v]=graph[s][v];}
    Dist[s]=0;
    for (int i=0; i<n; i++) {
        v=Order[i];
        for (int pred=0; pred<n; pred++) if (graph[pred][v]!=Inf)
            if (Dist[pred]+graph[pred][v]>Dist[v]) Dist[v]=Dist[pred]+graph[pred][v];
    }

    return Dist[d]; //Возвращаем последнею величину v (=Order[n-1]) 
}

Возможно, как-то можно внести изменение в этот код, чтобы решалось нормально. Помогите плиз!!!!
  

Автор: Dars2 24.5.2006, 16:56
Неужели нет решения???? 

Автор: Vaulter 24.5.2006, 17:49
Dars2, есть, но стоит денег 

Автор: Helicopterr 25.5.2006, 00:49
Цитата(Dars2)
Необходимо сделать так чтобы он искал длиннейший путь, при это не заходя в уже посещенные вершины

Это же задача коммивояжера. Только там, кажется, ближайший путь. Ищи в сети + http://forum.vingrad.ru/index.php?showtopic=21618&hl=%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0,and,%D0%BA%D0%BE%D0%BC%D0%B8%D0%B2%D0%BE%D1%8F%D0%B6%D0%B5%D1%80%D0%B0&st=15   

Автор: Dars2 27.5.2006, 09:38
Цитата(Vaulter @ 24.5.2006,  17:49)
Dars2, есть, но стоит денег

Готов заплатить если действительно четкое решение будет с минимальной сложностью 

Автор: Helicopterr 27.5.2006, 18:36
Dars2
А что значит 
Цитата(Dars2)
Используем техничку динамического программирования
 smile ??? 

Автор: Dars2 27.5.2006, 19:14
Цитата(Helicopterr @ 27.5.2006,  18:36)
Dars2
А что значит 
Цитата(Dars2)
Используем техничку динамического программирования
 smile ???

очепятка)))

Люди ну помогите плиз!!! 

Автор: Earnest 29.5.2006, 12:16
1) Топологическая сортировка не применима к графу с циклами. 
2) Чтобы не заходить в вершины повторно, помечай их - это стандартная техника. 

Автор: pablo 29.5.2006, 16:39
А не подойдёт ли здесь алгоритм Дейкстры, только вмеско поиска самой короткой вершины графа, искать самую длинную ? 

Автор: Dars2 3.6.2006, 11:40
Earnest, ну я так понимаю что без топологической сортировки, даже если помечать вершины алгоритм уже не будет работать корректно? 

pablo, Дейкстры тоже только без циклов работает... 

Автор: Earnest 5.6.2006, 08:25
Цитата(Dars2 @  3.6.2006,  12:40 Найти цитируемый пост)
Earnest, ну я так понимаю что без топологической сортировки, даже если помечать вершины алгоритм уже не будет работать корректно? 

Естественно... 
А алгоритм поиска короткого пути не обращается... Кстати, с циклами он отлично работает: кратчайший путь он и есть кратчайший. А вот самый длинный путь требует более жесткого определения: ведь если начать ходить кругами, много накрутить можно. Поэтому это требование (без возвратов) должно быть явно выражено в алгоритме. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)