Как найти цикл максимальной длины

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

IEnumerable<Stack<int>> FindAllCycles(int[,] edges, int currentV, HashSet<int> alreadyVisited, Stack<int> currentPath)
{
    if (alreadyVisited.Contains(currentV))
    {
        var ret = new Stack<int>();
        ret.Push(currentV);
        foreach (var v in currentPath)
        {
            ret.Push(v);
            // Крутим путь только до начала цикла
            if (v == currentV) break;
        }

        yield return ret;
    }
    else
    {
        alreadyVisited.Add(currentV);
        currentPath.Push(currentV);

        for (int i = 0; i < edges.GetLength(1); i++)
            if (currentV != i && edges[currentV, i] == 1)
                foreach (var cycle in FindAllCycles(edges, i, alreadyVisited, currentPath)) yield return cycle;

        alreadyVisited.Remove(currentV);
        currentPath.Pop();
    }
}

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

var vertices = new Dictionary<int, char>() { { 0, 'А' }, { 1, 'Б' }, { 2, 'В' }, { 3, 'Г' }, { 4, 'Д' } };

var edges = new int[,] {
    {0, 1, 1, 0, 0},
    {0, 0, 1, 0, 1},
    {0, 0, 0, 0, 1},
    {1, 1, 0, 0, 0},
    {0, 0, 0, 1, 0},
};

var allCycles = vertices.Keys.SelectMany(x => FindAllCycles(edges, x, new HashSet<int>(), new Stack<int>()));
Stack<int> maxCycle = null;

foreach(var cycle in allCycles){
    if (maxCycle == null || maxCycle.Count < cycle.Count)
        maxCycle = cycle;
}   

if (maxCycle == null)   
    Console.WriteLine("No cycles!");    
else    
    Console.WriteLine(String.Join('-', maxCycle.Select(m => vertices[m])));

Вывод в консоль

А-Б-В-Д-Г-А

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

Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 27 октября 2021 года; проверки требует 1 правка.

Задача о самом длинном пути — это задача поиска простого пути максимальной длины в заданном графе. Путь называется простым, если в нём нет повторных вершин. Длина пути может быть измерена либо числом рёбер, либо (в случае взвешенных графов) суммой весов его рёбер. В отличие от задачи кратчайшего пути, которая может быть решена за полиномиальное время на графах без циклов с отрицательным весом, задача нахождения самого длинного пути является NP-трудной и не может быть решена за полиномиальное время для произвольных графов, если только не P = NP. Принадлежность более тяжелому классу сложности также означает, что задачу трудно аппроксимировать. Однако задача решается за линейное время на ориентированных ациклических графах, которые имеют важное применение в задачах нахождения критического пути в задачах планирования.

NP-трудность[править | править код]

NP-трудность невзвешенной задачи поиска самого длинного пути можно показать, сведя задачу к поиску гамильтонова пути[en] — граф G имеет гамильтонов путь тогда и только тогда, когда самый длинный путь в нём имеет длину n − 1, где n — число вершин графа G. Поскольку задача поиска гамильтонова пути является NP-полной, это сведение показывает, что задачи поиска самого длинного пути в варианте разрешимости также NP-полна. В этой задаче разрешимости входом является граф G и число k. Ожидается выход “да”, если G содержит путь с k и больше дугами, или нет в противном случае[1].

Если бы задача поиска самого длинного пути могла быть решена за полиномиальное время, она могла бы быть использована для решения этой задачи разрешимости путём нахождения самого длинного пути и сравнения длины полученного пути с числом k. Таким образом, задача поиска самого длинного пути является NP-трудной. Она не является NP-полной, поскольку она не является задачей разрешимости[2].

Во взвешенных полных графах с неотрицательными весами рёбер задача поиска взвешенного самого длинного пути является той же самой задачей, что и задача коммивояжёра, поскольку самый длинный путь всегда включает все вершины этой задачи[3].

Ацикличные графы и критические пути[править | править код]

Самый длинный путь A между двумя заданными вершинами s и t во взвешенном графе G — это то же самое, что и кратчайший путь в графе −G, полученном из G путём замены всех весов на веса с обратным знаком. Таким образом, если кратчайший путь можно найти в −G, то можно найти и самый длинный путь в G[4].

Для большинства графов такое преобразование бесполезно, поскольку создаёт циклы отрицательной длины в −G. Но если G является ориентированным ациклическим графом, невозможно создать отрицательный цикл и самый длинный путь в G может быть найден за линейное время, применив алгоритм поиска кратчайшего пути в −G (тоже ориентированный ациклический граф), который работает за линейное время[4]. Например, для любой вершины v в ориентированном ациклическом графе длина самого длинного пути, заканчивающегося в v, может быть получена выполнением следующих шагов:

  1. Осуществляем топологическую сортировку заданного ориентированного ациклического графа (ОАГ).
  2. Для каждой вершины v ОАГ в топологической сортировке вычисляем длину самого длинного пути, завершающегося в вершине v путём просмотра входящих дуг от соседей и добавления единички к максимальной длине в записях этих соседей. Если v не имеет входящих дуг, присваиваем длину самого длинного пути, кончающегося в v, нулю.

Когда это будет сделано, самый длинный путь во всём графе можно получить, начав с вершины v с самым большим записанным значением и проходя в обратном порядке, выбирая входящую дугу, у которой запись в начальной вершине имеет наибольшее значение.

Метод критического пути для планирования набора работ использует построение ориентированного ацикличного графа, в котором вершины представляют узловые события проекта, а дуги представляют работы, которые должны быть выполнены до узлового события и после него. Каждой дуге присваивается вес, равный оценочному времени выполнения работы. В таком графе самый длинный путь от первого узлового события до последнего является критическим путём, который определяет полное время завершения проекта[4].

Самый длинный путь ориентированных ацикличных графов можно применить также для послойного рисования графов — располагаем каждую вершину v ориентированного ацикличного графа G на уровне, номер которого соответствует длине самого длинного пути, заканчивающегося в v. В результате получим расположение вершин по уровням, при котором число уровней будет минимальным[5].

Приближение[править | править код]

Бьёрклунд, Хасфелдт и Канна писали, что задача поиска самого длинного пути в невзвешенном неориентированном графе является «печально известной по сложности понимания её трудности аппроксимации»[6].
Лучший известный алгоритм аппроксимации полиномиального времени выполнения даёт лишь очень слабую аппроксимацию, {displaystyle n/exp(Omega ({sqrt {log n}}))} [7]. Для любого {displaystyle epsilon >0} невозможно аппроксимировать самый длинный путь со множителем, меньшим {displaystyle 2^{(log n)^{1-epsilon }}}, если только NP не принадлежит задачам квазиполиномиального детерминированного времени. Однако существует большой разрыв между этим результатом аппроксимируемости и известными алгоритмами аппроксимации для этой задачи[8].

В случае невзвешенных, но ориентированных графов известные сильные результаты аппроксимируемости. Для любого {displaystyle epsilon >0} задача не может быть аппроксимирована в пределах {displaystyle n^{1-epsilon }}, если только не P = NP, и, при сильных теоретических предположениях, задачу нельзя аппроксимировать в пределах {displaystyle n/log ^{2+epsilon }n}[6]. Можно использовать технику цветовой кодировки[en] для поиска пути логарифмической длины, если он существует, но эта техника даёт аппроксимационный коэффициент лишь {displaystyle O(n/log n)}[9].

Параметризованная сложность[править | править код]

Задача поиска самого длинного пути является фиксированно-параметрически разрешимой[en], если параметризовать её по длине пути. Например, задача может быть решена за время, линейно зависящее от размера входного графа (но за экспоненциальное время по длине пути), с помощью алгоритма, делающего следующие шаги:

  1. Осуществляем поиск в глубину по графу. Пусть d — глубина результирующего дерева поиска вглубь.
  2. Используем пути от корня к листам поиска дерева вглубь в порядке, в котором они просматриваются при поиске, в отличие от путевой декомпозиции графа с путевой шириной d.
  3. Используем динамическое программирование к этому разложению на пути для нахождения самого длинного пути за время {displaystyle O(d!2^{d}n)}, где n — число вершин графа.

Поскольку выходной путь имеет длину по меньшей мере d, время работы также будет ограничено значением {displaystyle O(ell !2^{ell }n)}, где ell — длина самого длинного пути[10]. Используя цветовую кодировку, зависимость от длины пути может быть сведена к одиночно экспоненциальной[11][12][13]. Похожая техника динамического программирования показывает, что задача нахождения самого длинного пути является также фиксированно-параметрически разрешимой по древесной ширине графа.

Для графов с ограниченной кликовой шириной задачу о самом длинном пути можно решить за полиномиальное время с помощью алгоритма динамического программирования. Однако степень полинома зависит от кликовой ширины графа, так что эти алгоритмы не являются фиксированно-параметрически разрешимыми. Задача нахождения самого длинного пути, параметризованная по ширине клик, является трудной для класса парметризованной сложности[en] {displaystyle W[1]}, что говорит о том, что вряд ли существует фиксированно-параметрически разрешимый алгоритм[14].

Специальные случаи графов[править | править код]

Задачу о самом длинном пути можно решить за полиномиальное время на дополнениях графов сравнимости[15]. Её можно решить также за полиномиальное время на любом классе графов с ограниченной древесной шириной или ограниченной кликовой шириной, таком как дистанционно-наследуемые графы. Однако задача является NP-трудной, даже если ограничимся расщепляемыми графами, круговыми графами или планарными графами[16].

См. также[править | править код]

  • Теорема Галлаи – Хассе – Роя – Витавера, двойственность самого длинного пути и раскраски графов
  • Задача о ходе коня
  • Задача о змее в коробке, самый длинный порождённый путь в графе гиперкуба

Примечания[править | править код]

  1. Schrijver, 2003, с. 114.
  2. Cormen, Leiserson, Rivest, Stein, 2001, с. 978.
  3. Lawler, 2001, с. 64.
  4. 1 2 3 Sedgewick, Wayne, 2011, с. 661–666.
  5. Di Battista, Eades, Tamassia, Tollis, 1998, с. 265–302.
  6. 1 2 Björklund, Husfeldt, Khanna, 2004, с. 222–233.
  7. (Gabow, Nie 2008). Для более ранних работ даже с более слабой аппроксимацией см. статьи Габова (Gabow 2007) и Бьёрклунда и Хасфелдта (Björklund, Husfeldt 2003).
  8. Karger, Motwani, Ramkumar, 1997, с. 82–98.
  9. Alon, Yuster, Zwick, 1995.
  10. (Bodlaender 1993). Для более раннего фиксированно-параметрически разрешимого алгоритма с чуть лучшей зависимостью от длины пути, но с худшей зависимостью от длины графа, см. статью (Monien 1985).
  11. Chen, Lu, Sze, Zhang, 2007, с. 298-307.
  12. Koutis, 2008, с. 575-586.
  13. Williams, 2009, с. 315-318.
  14. Fomin, Golovach, Lokshtanov, Saurabh, 2009, с. 825–834.
  15. (Ioannidou, Nikolopoulos 2011). Для более ранних работ на более ограниченных классах см. статьи (Ioannidou, Mertzios, Nikolopoulos 2011) и (Uehara, Valiente 2007).
  16. Ioannidou, Mertzios, Nikolopoulos, 2011.

Литература[править | править код]

  • Alexander Schrijver. Combinatorial Optimization: Polyhedra and Efficiency. — Springer, 2003. — Т. 24. — (Algorithms and Combinatorics). — ISBN 9783540443896.
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Introduction To Algorithms. — MIT Press, 2001. — ISBN 9780262032933.
  • Robert Sedgewick, Kevin Daniel Wayne. Algorithms. — Addison-Wesley Professional, 2011. — С. 661—666. — ISBN 9780321573513.
  • Eugene L. Lawler. Combinatorial Optimization: Networks and Matroids. — Courier Dover Publications, 2001. — С. 64. — ISBN 9780486414539.
  • Giuseppe Di Battista, Peter Eades, Roberto Tamassia, Ioannis G. Tollis. Graph Drawing: Algorithms for the Visualization of Graphs. — Prentice Hall, 1998. — С. 265—302. — ISBN 978-0-13-301615-4.
  • Andreas Björklund, Thore Husfeldt, Sanjeev Khanna. Proc. Int. Coll. Automata, Languages and Programming (ICALP 2004). — Berlin: Springer-Verlag, 2004. — Т. 3142. — С. 222—233. — (Lecture Notes in Computer Science).
  • Harold N. Gabow, Shuxin Nie. International Symposium on Algorithms and Computation. — Berlin: Springer, 2008. — Т. 5369. — С. 752—763. — (Lecture Notes in Computer Science). — doi:10.1007/978-3-540-92182-0_66.
  • Harold N. Gabow. Finding paths and cycles of superpolylogarithmic length // SIAM Journal on Computing. — 2007. — Т. 36, вып. 6. — С. 1648—1671. — doi:10.1137/S0097539704445366.
  • Andreas Björklund, Thore Husfeldt. Finding a path of superlogarithmic length // SIAM Journal on Computing. — 2003. — Т. 32, вып. 6. — С. 1395—1402. — doi:10.1137/S0097539702416761.
  • David Karger, Rajeev Motwani, G. D. S. Ramkumar. On approximating the longest path in a graph // Algorithmica. — 1997. — Т. 18, вып. 1. — С. 82—98. — doi:10.1007/BF02523689.
  • Noga Alon, Raphael Yuster, Uri Zwick. Color-coding // Journal of the ACM. — 1995. — Т. 42, вып. 4. — С. 844—856. — doi:10.1145/210332.210337.
  • Hans L. Bodlaender. On linear time minor tests with depth-first search // Journal of Algorithms. — 1993. — Т. 14, вып. 1. — С. 1—23. — doi:10.1006/jagm.1993.1001.
  • B. Monien. Analysis and design of algorithms for combinatorial problems (Udine, 1982). — Amsterdam: North-Holland, 1985. — Т. 109. — С. 239—254. — (North-Holland Math. Stud.). — doi:10.1016/S0304-0208(08)73110-4.
  • Jianer Chen, Songjian Lu, Sing-Hoi Sze, Fenghui Zhang. Proc. 18th ACM-SIAM Symposium on Discrete algorithms (SODA ’07). — 2007. — С. 298—307.
  • Ioannis Koutis. International Colloquium on Automata, Languages and Programming. — Berlin: Springer, 2008. — Т. 5125. — С. 575—586. — (Lecture Notes in Computer Science). — doi:10.1007/978-3-540-70575-8_47.
  • Ryan Williams. Finding paths of length k in O*(2k) time // Information Processing Letters. — 2009. — Т. 109, вып. 6. — С. 315—318. — doi:10.1016/j.ipl.2008.11.004. — arXiv:0807.3026.
  • Fedor V. Fomin, Petr A. Golovach, Daniel Lokshtanov, Saket Saurabh. Proc. 20th ACM-SIAM Symposium on Discrete Algorithms (SODA ’09). — 2009. — С. 825—834.
  • Kyriaki Ioannidou, Stavros D. Nikolopoulos. The longest path problem is polynomial on cocomparability graphs // Algorithmica. — 2011. — doi:10.1007/s00453-011-9583-5.
  • Kyriaki Ioannidou, George B. Mertzios, Stavros D. Nikolopoulos. The longest path problem has a polynomial solution on interval graphs // Algorithmica. — 2011. — Т. 61, вып. 2. — С. 320—341. — doi:10.1007/s00453-010-9411-3.
  • Ryuhei Uehara, Gabriel Valiente. Linear structure of bipartite permutation graphs and the longest path problem // Information Processing Letters. — 2007. — Т. 103, вып. 2. — С. 71—77. — doi:10.1016/j.ipl.2007.02.010.
  • Метод нечёткого критического пути / Акимов В. А., Балашов В. Г., Заложнев А. Ю. // Управление большими системами. Выпуск 3. М.: ИПУ РАН, 2003. С. 5-10.

Ссылки[править | править код]

  • “Find the Longest Path”, песня Дана Барретта (Dan Barrett)


Форум программистов Vingrad

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> поиск цикла максимальной длины  

:(

   

Опции темы

magicfa
Дата 19.12.2008, 08:34 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Новичок

Профиль
Группа: Участник
Сообщений: 1
Регистрация: 19.12.2008

Репутация: нет
Всего: нет

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

PM MAIL   Вверх
Silent
Дата 19.12.2008, 11:32 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: 1
Всего: 9

Ну дык… поиск в глубину из этой вершины…

PM MAIL   Вверх
SoWa
Дата 19.12.2008, 12:30 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Харекришна
****

Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74

Действительно, это стандартный алгоритм на графах, описаный в любой книге по данной тематике. Вот, если не ошибаюсь, примеры:
http://algolist.ru/maths/graphs/maxflows/

——————–

Всем добра smile

PM MAIL ICQ   Вверх
maxdiver
Дата 19.12.2008, 13:10 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18

SoWa
Я извиняюсь, а при чём тут потоки? smile

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

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

PM MAIL WWW ICQ   Вверх
Earnest
Дата 19.12.2008, 17:24 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183

maxdiver, насколько я помню, задача о поиски максимального цикла, в отличие от поиска минимального, не является тривиальной задачей, а является как раз np-полной. Говоря по-русски, пахнет полным перебором. Не всегда же есть гамильтонов цикл.

——————–

PM   Вверх
maxdiver
Дата 19.12.2008, 17:31 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18

Earnest, ну так и я о том же smile

Добавлено @ 17:37

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

Я подумал, что этой фразы достаточно, чтобы ни у кого не осталось сомнений в том, что задача ТС является NP-полной.

(хотя сначала я сам чуть не поверил в алгоритм с дфсом smile )

Это сообщение отредактировал(а) maxdiver – 19.12.2008, 17:38

PM MAIL WWW ICQ   Вверх
Earnest
Дата 19.12.2008, 17:42 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183

Цитата(maxdiver @  19.12.2008,  18:31 Найти цитируемый пост)
(хотя, на самом деле, я сам чуть не поверил в алгоритм с дфсом  ) 

Ага, так бывает, когда заявляют с таким апломбом, а ты помнишь смутно…
Я, честно сказать, перепутала тебе с magicfa (тоже на ma-…).
Что касается автора, т.е. magicfa, есть сомнения, что тебе нужно решать именно такую задачу. Скорее всего, возможны другие подходы. Разве что это прямое задание от преподавателя.

——————–

PM   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума “Алгоритмы”

maxim1000

Форум “Алгоритмы” предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.

  • Для решения контрольных, курсовых, дипломов и т.п. обращайтесь в Центр помощи
  • Похвалиться своими достижениями можно в разделе Интересные и занимательные задачи
  • Для поиска нужной литературы есть специальный раздел

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »

  • В этой теме 1 ответ, 2 участника, последнее обновление 1 год, 5 месяцев назад сделано .
  • Сообщения

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

      Примерный граф

    • Вот тут можно взять функцию, рассчитывающую все циклы в графе. При этом цикл возвращается в виде списка узлов. Все что вам остается сделать — найти список с максимальной длиной. Сделать это можно так:

      longest_list(List, Longest):-
          member(Longest, List), length(Longest, MaxLen),
          + (   
          	member(Other, List),
              length(Other, OtherLen),
              OtherLen > MaxLen
          ).

      Тут мы записали правило — список является самым длинным если не существует другого списка, длина которого больше.

      Остается лишь вызвать готовые функции чтобы получить решение вашей задачи.

  • Автор

    Сообщения

  • Для ответа в этой теме необходимо авторизоваться.

>
Максимальный цикл в графе

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
24.04.06, 20:20

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


    Морской Ёж



    Сообщ.
    #2

    ,
    25.04.06, 11:00

      Senior Member

      ****

      Рейтинг (т): 17

      Какая сложность? Можно back tracking’ом. Больше пока ничего на ум не приходит.


      kl



      Сообщ.
      #3

      ,
      25.04.06, 11:59

        Совершенно очевидно, что это NP-complete задача, ибо если бы за полиномиальное время можно было бы найти максимальный простой цикл, то мы бы автоматически решили бы и TSP (задачу коммивояжера). Просто путем проверки, гамильтонов ли цикл.
        Так что про точный алгоритм можно забыть (если конечно P != NP). Лучшее что придумало человечество на сегодняшний день – H.N. Gabow. Finding Paths and Cycles of Superpolylogarithmic Length, In Proceedings of the 36th ACM Symposium on the Theory of Computing (STOC), 2004, 407-416
        Но и там циклы далеки от максимальных. Правда время полиномиально

        Profi

        shadeofgray



        Сообщ.
        #4

        ,
        25.04.06, 12:29

          Moderator

          *****

          Рейтинг (т): 30

          Расшифровывая сказанное выше: перебор, перебор и только полный перебор всех циклов. Приведенная ссылка позволяет оптимизировать перебор, но ценой того, что находятся не самые длинные циклы, а просто “немного длинные”


          kl



          Сообщ.
          #5

          ,
          25.04.06, 13:23

            Цитата shadeofgray @ 25.04.06, 12:29

            Расшифровывая сказанное выше: перебор, перебор и только полный перебор всех циклов. Приведенная ссылка позволяет оптимизировать перебор, но ценой того, что находятся не самые длинные циклы, а просто “немного длинные”

            Ага, именно так, спасибо 🙂 Я извиняюсь, у меня иногда возникают сложности с объяснением на русском того, что я на русском никогда не изучал…


            vek21



            Сообщ.
            #6

            ,
            26.04.06, 06:07

              Цитата kl @ 25.04.06, 11:59

              Просто путем проверки, гамильтонов ли цикл.

              А при чём здесь гамильтонов цикл? Гамильтонов цикл – это цикл, который проходит через все вершины графа, но не обязательно, что этот цикл максимальный.


              mo3r



              Сообщ.
              #7

              ,
              26.04.06, 06:55

                Цитата vek21 @ 26.04.06, 06:07

                А при чём здесь гамильтонов цикл? Гамильтонов цикл – это цикл, который проходит через все вершины графа, но не обязательно, что этот цикл максимальный.

                Скажем, так:
                сделаем следующее преобразование графа:
                Пусть M — максимальное ребро. Для каждого ребра (u,v) преобразуем его вес w следующим образом: w’=M-w. Для полученного графа найдем максимальный цикл. Этот же цикл будет являться решением задачи коммивояжера для исходного графа.

                Цитата vek21 @ 24.04.06, 20:20

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

                Если граф эйлеров, то максимальным циклом, не проходящим по ребру дважды в одном направлении, будет эйлеров цикл.


                Морской Ёж



                Сообщ.
                #8

                ,
                27.04.06, 13:08

                  Senior Member

                  ****

                  Рейтинг (т): 17

                  Цитата mo3r @ 26.04.06, 06:55

                  Гамильтонов цикл – это цикл, который проходит через все вершины графа, но не обязательно, что этот цикл максимальный.

                  Я, конечно, не спорю, что гамильтонов цикл здесь не при чем, но есть небольшая поправка – гамильтонов цикл всегда минимален для данного графа.


                  kl



                  Сообщ.
                  #9

                  ,
                  27.04.06, 13:37

                    Цитата Arsuit @ 27.04.06, 13:08

                    Я, конечно, не спорю, что гамильтонов цикл здесь не при чем, но есть небольшая поправка – гамильтонов цикл всегда минимален для данного графа.

                    Гамильтонов цикл здесь очень даже причем. mo3r достаточно ясно показал, то о чем я говорил в первом посте, а именно, как задача нахождения гамильтонова цикла сводится к исходной задаче. Сводится по Куку. Отсюда автоматически следует, что либо вам удается показать, что P = NP, либо вы не сможете решить свою задачу точно и за приемлемое время. Вот и все.
                    Любую другую NP-полную задачу тоже можно свести к максимальному циклу. Например поиск максимальной клики в графе, satisfiability, задачу о сумме подпоследовательности и еще пару сотен задач. Но для гамильтонова цикла это показывается наиболее легко.


                    kl



                    Сообщ.
                    #10

                    ,
                    27.04.06, 14:53

                      Цитата Arsuit @ 27.04.06, 13:08

                      гамильтонов цикл всегда минимален для данного графа.

                      Это почему?


                      Морской Ёж



                      Сообщ.
                      #11

                      ,
                      06.05.06, 12:31

                        Senior Member

                        ****

                        Рейтинг (т): 17

                        по опредилению вроде.


                        kl



                        Сообщ.
                        #12

                        ,
                        06.05.06, 23:02

                          Цитата Arsuit @ 06.05.06, 12:31

                          по опредилению вроде.

                          Прочитай определение еще разок.


                          esperanto



                          Сообщ.
                          #13

                          ,
                          07.05.06, 03:31

                            математик

                            *****

                            Рейтинг (т): 50

                            Цитата kl @ 25.04.06, 11:59

                            Совершенно очевидно, что это NP-complete задача,

                            Судя по вашим словам, совершенно очевидно, что задача NP=HARD.

                            Добавлено 07.05.06, 03:36
                            так на вскидку, я бы сказал что задача скорей всего из класса Р-Space


                            kl



                            Сообщ.
                            #14

                            ,
                            07.05.06, 15:41

                              Да, я согласен, что термин NP-complete тут надо употреблять аккуратнее, потому что он строго определен только для decision problems (а TSP в классической формулировке таковой не является). Тем не менее ее можно перевести в класс decision problems. Но мне не хотелось вдаваться в эти детали, я просто имел в виду, что задача поиска максимального цикла – как минимум так же сложна как и TSP. И наоборот.


                              KAV_Invariant



                              Сообщ.
                              #15

                              ,
                              09.05.06, 09:16

                                Вот мне надо как-то было найти минимальный цикл в графе. Была у меня идея пробежаться по всем вершинам и для каждой вершины найти кратчайший путь из нее в нее же. Только вот я не знаю, как это сделать :(
                                Может, здесь тоже можно так попробовать, только искать длиннейший путь?

                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                0 пользователей:

                                • Предыдущая тема
                                • Алгоритмы
                                • Следующая тема

                                [ Script execution time: 0,0333 ]   [ 15 queries used ]   [ Generated: 24.05.23, 06:19 GMT ]  

                                Добавить комментарий