Как найти самый длинный цикл в графе

I have an answer explaining an easy way to find all cycles in a directed graph using Python and networkX in another post. Finding all cycles in a directed graph

The solution will output a list containing all cycles of the directed graph.

You can use this output to find the longest cycle ans it is shown bellow:

import networkx as nx

# Create Directed Graph
G=nx.DiGraph()

# Add a list of nodes:
G.add_nodes_from(["1","2","3","4","5","6","7","9"])

# Add a list of edges:
G.add_edges_from([("7","9"),("1","2"),("2","3"),("3","1"),("3","4"),("4","5"),("5","1"),("5","6"),("6","7"),("7","2")])

#Return a list of cycles described as a list o nodes
all_cycles = list(nx.simple_cycles(G))

#Find longest cycle
answer = []
longest_cycle_len = 0
for cycle in all_cycles:
    cycle_len = len(cycle)
    if cycle_len>longest_cycle_len:
        answer =cycle
        longest_cycle_len = cycle_len

print "Longest Cycle is {} with length {}.".format(answer,longest_cycle_len)

Answer: Longest Cycle is [‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘2’] with length 6.

If you find it interesting upvote up the original answer too. It is an old discussion with many answers and it will help bringing the new solution up.

Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 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)

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

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])));

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

А-Б-В-Д-Г-А

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

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

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



Сообщ.
#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,0335 ]   [ 15 queries used ]   [ Generated: 16.05.23, 23:24 GMT ]  

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

                                Решение выведет список, содержащий все циклы ориентированного графа.

                                Вы можете использовать этот вывод, чтобы найти самый длинный цикл, как показано ниже:

                                import networkx as nx
                                
                                # Create Directed Graph
                                G=nx.DiGraph()
                                
                                # Add a list of nodes:
                                G.add_nodes_from(["1","2","3","4","5","6","7","9"])
                                
                                # Add a list of edges:
                                G.add_edges_from([("7","9"),("1","2"),("2","3"),("3","1"),("3","4"),("4","5"),("5","1"),("5","6"),("6","7"),("7","2")])
                                
                                #Return a list of cycles described as a list o nodes
                                all_cycles = list(nx.simple_cycles(G))
                                
                                #Find longest cycle
                                answer = []
                                longest_cycle_len = 0
                                for cycle in all_cycles:
                                    cycle_len = len(cycle)
                                    if cycle_len>longest_cycle_len:
                                        answer =cycle
                                        longest_cycle_len = cycle_len
                                
                                print "Longest Cycle is {} with length {}.".format(answer,longest_cycle_len)
                                

                                Ответ: Самый длинный цикл – [‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘2’] с длиной 6.

                                Если вам это интересно, проголосуйте за исходный ответ. Это старое обсуждение с множеством ответов, и оно поможет найти новое решение.

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