Cycles in directed graph









up vote
3
down vote

favorite
1












I am wiring a function to check whether a graph contains a cycle.



It is represented as a list of lists of all indexes of nodes each node is connected to. Nodes are enumerated from 1 (task requirement).



While checking the graph [[2, 3], , [4], ], the program enters the first listed node correctly, yet in the second iteration, it is assumed that adjlist[node-1] is an int of value 3 rather than an array (or int = 2 at very least)



What am I missing?



The code:



def is_acyclic(adjlist: List, visited: List, path: List) -> bool:
'''
:param adjlist: list representation of a graph; eg: [[2, 3], , [4], ]
:param visited: visited nodes
:param path: visited nodes in current iteration
:return: the graph does not contain a cycle
'''

for node in range(1, len(adjlist)+1):
if node not in visited:
visited.append(node)
path.append(node)

for child in adjlist[node-1]:
if child in path:
return False
elif child not in visited:
if is_acyclic(adjlist[node-1], visited, path) is False:
return False

path.remove(node)
return True









share|improve this question



























    up vote
    3
    down vote

    favorite
    1












    I am wiring a function to check whether a graph contains a cycle.



    It is represented as a list of lists of all indexes of nodes each node is connected to. Nodes are enumerated from 1 (task requirement).



    While checking the graph [[2, 3], , [4], ], the program enters the first listed node correctly, yet in the second iteration, it is assumed that adjlist[node-1] is an int of value 3 rather than an array (or int = 2 at very least)



    What am I missing?



    The code:



    def is_acyclic(adjlist: List, visited: List, path: List) -> bool:
    '''
    :param adjlist: list representation of a graph; eg: [[2, 3], , [4], ]
    :param visited: visited nodes
    :param path: visited nodes in current iteration
    :return: the graph does not contain a cycle
    '''

    for node in range(1, len(adjlist)+1):
    if node not in visited:
    visited.append(node)
    path.append(node)

    for child in adjlist[node-1]:
    if child in path:
    return False
    elif child not in visited:
    if is_acyclic(adjlist[node-1], visited, path) is False:
    return False

    path.remove(node)
    return True









    share|improve this question

























      up vote
      3
      down vote

      favorite
      1









      up vote
      3
      down vote

      favorite
      1






      1





      I am wiring a function to check whether a graph contains a cycle.



      It is represented as a list of lists of all indexes of nodes each node is connected to. Nodes are enumerated from 1 (task requirement).



      While checking the graph [[2, 3], , [4], ], the program enters the first listed node correctly, yet in the second iteration, it is assumed that adjlist[node-1] is an int of value 3 rather than an array (or int = 2 at very least)



      What am I missing?



      The code:



      def is_acyclic(adjlist: List, visited: List, path: List) -> bool:
      '''
      :param adjlist: list representation of a graph; eg: [[2, 3], , [4], ]
      :param visited: visited nodes
      :param path: visited nodes in current iteration
      :return: the graph does not contain a cycle
      '''

      for node in range(1, len(adjlist)+1):
      if node not in visited:
      visited.append(node)
      path.append(node)

      for child in adjlist[node-1]:
      if child in path:
      return False
      elif child not in visited:
      if is_acyclic(adjlist[node-1], visited, path) is False:
      return False

      path.remove(node)
      return True









      share|improve this question















      I am wiring a function to check whether a graph contains a cycle.



      It is represented as a list of lists of all indexes of nodes each node is connected to. Nodes are enumerated from 1 (task requirement).



      While checking the graph [[2, 3], , [4], ], the program enters the first listed node correctly, yet in the second iteration, it is assumed that adjlist[node-1] is an int of value 3 rather than an array (or int = 2 at very least)



      What am I missing?



      The code:



      def is_acyclic(adjlist: List, visited: List, path: List) -> bool:
      '''
      :param adjlist: list representation of a graph; eg: [[2, 3], , [4], ]
      :param visited: visited nodes
      :param path: visited nodes in current iteration
      :return: the graph does not contain a cycle
      '''

      for node in range(1, len(adjlist)+1):
      if node not in visited:
      visited.append(node)
      path.append(node)

      for child in adjlist[node-1]:
      if child in path:
      return False
      elif child not in visited:
      if is_acyclic(adjlist[node-1], visited, path) is False:
      return False

      path.remove(node)
      return True






      python python-3.x graph-theory






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 8 at 23:13









      Dominique Fortin

      1,622816




      1,622816










      asked Oct 23 at 22:41









      Filip Frey

      182




      182






















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          This is due to the fact that the function is being called recursively. This part of your code keeps trimming the graph adjacency list:



           elif child not in visited:
          if is_acyclic(adjlist[node-1], visited, path, level=level + 1) is False:
          return False


          The first time adjacency list is:



          [[2, 3], , [4], ]


          and adjlist[node-1] is [2, 3]



          the second time around adjacency list is:



          [2, 3]


          and adjlist[node-1] is 3



          since 2 is already in visited, node actually gets incremented to 2. Hence, you see:



           adjlist[node-1] == adjlist[2-1] == adjlist[1] == 3





          share|improve this answer




















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













             

            draft saved


            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52958765%2fcycles-in-directed-graph%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            0
            down vote













            This is due to the fact that the function is being called recursively. This part of your code keeps trimming the graph adjacency list:



             elif child not in visited:
            if is_acyclic(adjlist[node-1], visited, path, level=level + 1) is False:
            return False


            The first time adjacency list is:



            [[2, 3], , [4], ]


            and adjlist[node-1] is [2, 3]



            the second time around adjacency list is:



            [2, 3]


            and adjlist[node-1] is 3



            since 2 is already in visited, node actually gets incremented to 2. Hence, you see:



             adjlist[node-1] == adjlist[2-1] == adjlist[1] == 3





            share|improve this answer
























              up vote
              0
              down vote













              This is due to the fact that the function is being called recursively. This part of your code keeps trimming the graph adjacency list:



               elif child not in visited:
              if is_acyclic(adjlist[node-1], visited, path, level=level + 1) is False:
              return False


              The first time adjacency list is:



              [[2, 3], , [4], ]


              and adjlist[node-1] is [2, 3]



              the second time around adjacency list is:



              [2, 3]


              and adjlist[node-1] is 3



              since 2 is already in visited, node actually gets incremented to 2. Hence, you see:



               adjlist[node-1] == adjlist[2-1] == adjlist[1] == 3





              share|improve this answer






















                up vote
                0
                down vote










                up vote
                0
                down vote









                This is due to the fact that the function is being called recursively. This part of your code keeps trimming the graph adjacency list:



                 elif child not in visited:
                if is_acyclic(adjlist[node-1], visited, path, level=level + 1) is False:
                return False


                The first time adjacency list is:



                [[2, 3], , [4], ]


                and adjlist[node-1] is [2, 3]



                the second time around adjacency list is:



                [2, 3]


                and adjlist[node-1] is 3



                since 2 is already in visited, node actually gets incremented to 2. Hence, you see:



                 adjlist[node-1] == adjlist[2-1] == adjlist[1] == 3





                share|improve this answer












                This is due to the fact that the function is being called recursively. This part of your code keeps trimming the graph adjacency list:



                 elif child not in visited:
                if is_acyclic(adjlist[node-1], visited, path, level=level + 1) is False:
                return False


                The first time adjacency list is:



                [[2, 3], , [4], ]


                and adjlist[node-1] is [2, 3]



                the second time around adjacency list is:



                [2, 3]


                and adjlist[node-1] is 3



                since 2 is already in visited, node actually gets incremented to 2. Hence, you see:



                 adjlist[node-1] == adjlist[2-1] == adjlist[1] == 3






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Oct 23 at 22:58









                LeKhan9

                921112




                921112



























                     

                    draft saved


                    draft discarded















































                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52958765%2fcycles-in-directed-graph%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

                    How do I collapse sections of code in Visual Studio Code for Windows?

                    ャフサォクコ ケウ,コ,ワ メ,ロスョノ゙,クネ,フムカヤヲニ,エコ゚ツ ウイオン゙ケワサネォキモュキォウイノンコチ゚メヌナイゥフュ,カヒウネェ ネ,ホノケ,ムュキ ッボーミュハ,チ ツス ィ メウイマヤ,゙ウチ ヅ ロ,ォジヌェ ャヌット ェ,マャ,チナエヒネソキツテ トホヲヲミーァ