2016-08-27 13 views
0

私のグラフはPythonで実装されています。これは有向グラフです。トポロジカルソートが予期したとおりに動作しない

class DiGraph: 
    def __init__(self): 
     self.all_vertices = [] 
     self.vertex_map = {} 
     self.size = 0 

    def add(self, a, b): 

     if a in self.vertex_map: 
      av = self.vertex_map[a] 
      if b in self.vertex_map: 
       bv = self.vertex_map[b] 
       av.add(bv) 
      else: 
       bv = Vertex(b) 
       av.add(bv) 
       self.vertex_map[b] = bv 
       self.all_vertices.append(bv) 
       self.size += 1 
     else: 
      av = Vertex(a) 
      self.size += 1 
      if b in self.vertex_map: 
       bv = self.vertex_map[b] 
       av.add(bv) 
      else: 
       bv = Vertex(b) 
       av.add(bv) 
       self.vertex_map[b] = bv 
       self.all_vertices.append(bv) 
       self.size += 1 
      self.vertex_map[a] = av 
      self.all_vertices.append(av) 

    def __sizeof__(self): 
     return self.size 

    def print(self): 
     for v in self.all_vertices: 
      print(v.data, end='->') 
      for n in v.neighbors: 
       print(n.data, end=', ') 
      print() 


class Vertex: 
    def __init__(self, data): 
     self.data = data 
     self.neighbors = [] 
     self.connections = 0 

    def add(self, item): 
     self.neighbors.append(item) 
     self.connections += 1 

これはこれは、発信者のグラフであるトポロジカルソートのための私のコード

def top_sort(g): 
    stack = [] 
    visited = set() 

    for v in g.all_vertices: 
     if v not in visited: 
      top_sort_util(v, visited, stack) 

    for ele in stack: 
     print(ele, end=' ') 
    print() 


def top_sort_util(v, visited, stack): 
    visited.add(v) 
    for n in v.neighbors: 
     if n in visited: 
      continue 
     top_sort_util(n, visited, stack) 
    stack.append(n) 

です。

def main(): 
    graph = DiGraph() 
    graph.add(1, 2) 
    graph.add(1, 3) 
    graph.add(3, 4) 
    graph.add(3, 5) 
    graph.add(2, 6) 
    graph.add(2, 7) 
    graph.add(2, 8) 

    top_sort(graph) 


if __name__ == '__main__': 
    main() 

これは私がラインstack.append(N)にそれを見ることができます私が取得エラーメッセージ、コードのデバッグに

stack.append(n) 
UnboundLocalError: local variable 'n' referenced before assignment 

では何も追加されなかっ取得し、再帰が出て折るのにコールスタックは、top_sort_util内のネイバを横切る次の反復には向かない。 論理的にここで何が間違っているのか分からないようです。 助けていただければ幸いです。

答えて

1

v.neighborsが空の場合、nが設定されることはありませんので、stack.append(n)for n in v.neighbors:は失敗します。

すべてnがスタックに追加されなければならない場合には(だけではなく、最後の)、インデントstack.append()適切にループ内なるために:

def top_sort_util(v, visited, stack): 
    visited.add(v) 
    for n in v.neighbors: 
     if n in visited: 
      continue 
     top_sort_util(n, visited, stack) 
     stack.append(n) 
関連する問題