NAPA_ya00
@NAPA_ya00 (NAPA)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

DFSのプログラムの問題

解決したいこと

DFSのプログラムの問題を解いています。
問題は3つのパートに別れており、2つ目のパートにエラーがあると考えられます。
何度もやり直したり別のコードを試しましたが、1ヶ月以上スタックしており、手がかりがありません。
回答についてアイデアをいただけないでしょうか。

Part1(正解)
スクリーンショット 2022-11-23 11.32.04.png
スクリーンショット 2022-11-23 11.32.11.png
スクリーンショット 2022-11-23 11.32.20.png
スクリーンショット 2022-11-23 11.32.29.png
スクリーンショット 2022-11-23 11.32.42.png

Part2(エラーが出ている箇所)
スクリーンショット 2022-11-23 11.17.00.png

プログラムは以下です。
#your code here 以下を記載しています。 2つ目のスクリーンショットは固定なので、1枚目が問題と考えています。
スクリーンショット 2022-11-23 11.20.05.png
スクリーンショット 2022-11-23 11.17.13.png

発生している問題・エラー


---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-4-6adafcd6964a> in <module>
      8 g.add_edge(3,4)
      9 
---> 10 assert num_connected_components(g) == 1, f' Test A failed: g must have 1 connected component. Your code returns {num_connected_components(g)}'
     11 
     12 

AssertionError:  Test A failed: g must have 1 connected component. Your code returns None

スクリーンショット 2022-11-23 11.14.18.png

該当するソースコード

def num_connected_components(g): # g is an UndirectedGraph class
# your code here

#UnidirectedGraph Class
    class UndirectedGraph():

    #init function to declare class variables and declare number of vertices
        def __init__(self, V):
            self.V = V
            self.adj = [[] for i in range(V)]

        # method to add an undirected edge add_edge function
        def add_edge(self, u, v):
            self.adj[u].append(v)
            self.adj[v].append(u)

        def dfs_traverse_graph(g, temp, v, visited):
            #Mark the current vertex as visited
            visited[v] = True

        #Store the vertex to list
            temp.append(v)

        # Repeat for all vertices adjacent to this vertex v
            for i in g.adj[v]:
                if visited[i] == False:
                    temp = dfs_traverse_graph(g, temp, i, visited)
            return temp

        #Method to retrieve connected components in an undirected graph
        def num_connected_components(g):
            visited = []
            cc = []
            for i in range(g.V):
                visited.append(False)

            for v in range(g.V):
                if visited[v] == False:
                    temp = []
                    cc.append(dfs_traverse_graph(g, temp, v, visited))
            return len(cc)

Part3 (こちらはエラーが出ていますが、上記のコードを記載しない状態だと正常に動作します。)
スクリーンショット 2022-11-23 11.22.39.png
スクリーンショット 2022-11-23 11.22.45.png
スクリーンショット 2022-11-23 11.22.52.png

正解の場合
スクリーンショット 2022-11-23 11.26.09.png

スクリーンショット 2022-11-23 11.23.04.png

0

2Answer

def num_connected_components(g)#your code hereでは,値を返す関数を記述すべきだと考えます.

対して,そちらのコードでは新たにclass UndirectedGraphを定義しているだけで,何も返さない関数となっています.

したがって,全てのassert num_connected_components(g) == 整数のような比較ではNone == 整数という状態になり,必ずAssertionErrorが発生し,問題が解決しないと考えます.

そもそもnum_connected_components(g)の引数にclass UndirectedGraphが渡されるのですから,これを利用してやりたい計算を記述,必要な値を返すべきです.

したがって,記述されたコードを見るからに

def num_connected_components(g):
    #your code here
    visited = [False for i in range(g.n)]
    cc = list()
    for v in range(g.n):
        if visited[v] == False:
            temp = []
            cc.append(dfs_traverse_graph(g, temp, v, visited))
    return len(cc)

と書かれるべきです.

1Like

Comments

  1. @NAPA_ya00

    Questioner

    ご回答ありがとうございます。
    いただいたコードを試すとAttributeErrorが出てしまいます。
    修正箇所が見当たらないのですが、どこが原因となりますでしょうか。

    ---------------------------------------------------------------------------
    AttributeError Traceback (most recent call last)
    <ipython-input-14-6adafcd6964a> in <module>
    8 g.add_edge(3,4)
    9
    ---> 10 assert num_connected_components(g) == 1, f' Test A failed: g must have 1 connected component. Your code returns {num_connected_components(g)}'
    11
    12

    <ipython-input-13-5c9e0b5684d6> in num_connected_components(g)
    1 def num_connected_components(g):
    2 #your code here
    ----> 3 visited = [False for i in range(g.V)]
    4 cc = list()
    5 for v in range(g.V):

    AttributeError: 'UndirectedGraph' object has no attribute 'V'
  2. どうやらIn[6]: で定義されているUndirectedGraphではそのVはnに相当するみたいですね,ちゃんと合わせて記述されると良いと思います.てっきりnum_connectred_components()に書き込んだUndirectedGraphと同じものが先に定義されていると勘違いしていました.
  3. @NAPA_ya00

    Questioner

    修正しましたが、別のエラーが発生しました。
    NameError: name 'dfs_traverse_graph' is not defined

    dfs_traverse_graphを定義する場所がいまいちわかっていません。。
    ---------------------------------------------------------------------------
    NameError Traceback (most recent call last)
    <ipython-input-23-6adafcd6964a> in <module>
    8 g.add_edge(3,4)
    9
    ---> 10 assert num_connected_components(g) == 1, f' Test A failed: g must have 1 connected component. Your code returns {num_connected_components(g)}'
    11
    12

    <ipython-input-22-a179723bd319> in num_connected_components(g)
    6 if visited[v] == False:
    7 temp = []
    ----> 8 cc.append(dfs_traverse_graph(g, temp, v, visited))
    9 return len(cc)

    NameError: name 'dfs_traverse_graph' is not defined
  4. もしかして闇雲にコードを書かれている感じでしょうか?
    画像2枚目のdfs_traverse_graphと画像7枚目のdfs_traverse_graphは引数の数が違いますがどういった意図なのでしょうか?
    前者はclass UndirectedGraphのもので,後者はグローバルな関数でそこも状態が違いますよね,そもyour code here以下に書かれてた部分を抜き出しただけで動かない,というのは闇雲に書かれている証左ではありませんか?

Your answer might help someone💌