2011-10-21 2 views
1

내 코드입니다 :: 파이썬 발생률 행렬 - 버텍스를 제거하는 방법? 여기

class incidenceMatrix: 
    def __init__(self, vertexNumber): 
     self.matrix = [] 
     for k in range(0, vertexNumber): 
      self.matrix += [[]] 
      #print self.matrix 

    def showGraph(self): 
     i = 1 
     for row in self.matrix: 
      print i, row 
      i += 1 

    def isEdge(self, v1, v2): 
     i = 1 
     for row in self.matrix: 
      if i == v1: 
       r1 = row 
      if i == v2: 
       r2 = row 
      i += 1 
     print r1, r2 
     for x in range(len(r1)): 
      if r1[x] == r2[x] and r1[x] + r2[x] > 0: 
       return True 
     return False 

    def addEdge(self, v1, v2): 
     i = 1 
     for row in self.matrix: 
      if i == v1: 
       row.append(1) 
      elif i == v2: 
       row.append(1) 
      else: 
       row.append(0) 
      i += 1 

    def removeEdge(self, v1, v2): 
     i = 1 
     for row in self.matrix: 
      if i == v1: 
       r1 = row 
      if i == v2: 
       r2 = row 
      i += 1 
     for x in range(len(r1)): 
      if r1[x] == r2[x] and r1[x] + r2[x] > 0: 
       col = x 
       r1[x] = 0 
       r2[x] = 0 
     for row in self.matrix: 
      if i == v1: 
       row = r1 
      if i == v2: 
       row = r2 
      i += 1 
     for row in self.matrix: 
      row[col] = 'X' 
      row.remove('X') 

def removeVertex(self, id): 
    pass 

if __name__ == '__main__': 
    GrafIM = incidenceMatrix(5) #verticesNumber 
    GrafIM.addEdge(2,3) 
    GrafIM.addEdge(1,3) 
    GrafIM.addEdge(2,1) 
    GrafIM.addEdge(5,2) 
    print GrafIM.isEdge(2,4) 
    GrafIM.showGraph() 
    print "-------" 
    GrafIM.removeEdge(2,5) 
    GrafIM.showGraph() 

이 내가 몇 가지 질문이 발생 매트릭스 입니다 :

1) 어떻게 정점을 제거하기를 - 방법을?

2) 파이썬 스타일로 코드를 만드는 방법은? 질문 3 참조)

3) 메서드에서 "i"증분을 사용합니까? 아마도 이것은 쓸만한 것이 될 수 있지만 어떻게 될까요?

편집 :

이제 버텍스를 삭제하는 방법을 보았습니다. 이 정점 1.

이 wher 난 그냥 열을 제거했지만 전체 시간은 2와 3은 카운터를 증가시키는 대신 enumerate를 사용하는 것입니다 귀하의 질문에 코드 품질

답변

1

:

def showGraph(self): 
    i = 1 
    for row in self.matrix: 
     print i, row 
     i += 1 

을 단순화 할 수있다. 또한, 코드는 강화 업되는 비트를 어떤(), 열거()우편()로 :

class incidenceMatrix: 
    def __init__(self, vertexNumber): 
     self.matrix = [[] for k in range(vertexNumber)] 

    def showGraph(self): 
     for i, row in enumerate(self.matrix, 1): 
      print i, row 

    def isEdge(self, v1, v2): 
     return any(x and y for x, y in zip(self.matrix[v1-1], self.matrix[v2-1])) 

    def addEdge(self, v1, v2): 
     for i, row in enumerate(self.matrix, 1): 
      row.append(int(v1==i or v2==i)) 

    def removeEdge(self, v1, v2): 
     num_edges = len(self.matrix[0]) 
     for j in range(num_edges): 
      if self.matrix[v1-1][j] and self.matrix[v2-1][j]: 
       for row in self.matrix: 
        del row[j] 
       return 
     raise Exception('Edge(%d, %d) not found' % (v1, v2)) 

    def removeVertex(self, v): 
     targetrow = self.matrix.pop(v-1) # fetch and delete the target vertex 
     for col, selector in reversed(list(enumerate(targetrow))): 
      if selector:     # find columns that had an edge on the target row 
       for row in self.matrix: 
        del row[col]   # remove that column (because the edge is gone) 

if __name__ == '__main__': 
    GrafIM = incidenceMatrix(5) #verticesNumber 
    GrafIM.addEdge(2,3) 
    GrafIM.addEdge(1,3) 
    GrafIM.addEdge(2,1) 
    GrafIM.addEdge(5,2) 
    print GrafIM.isEdge(2,4) 
    for pair in [(2,3), (1,3), (2,1), (5,2)]: 
     print GrafIM.isEdge(*pair) 
    GrafIM.showGraph() 
    print "-------" 
    GrafIM.removeEdge(2,5) 
    GrafIM.showGraph() 
    print "-------" 
    GrafIM.removeVertex(2) 
    GrafIM.showGraph()  

주, 당신이 대신 한 기반 색인을 포기하는 경우 파이썬의 제로 기반 색인, 당신은 코드를 조금 (* 열거 (에서 , 1 제거) 및 인덱스 조회에서 -1 제거를 단순화 할 수 있습니다.

을 또한, 당신이 딕셔너리을 사용하여 다른 표현을 고려하는 것이 좋습니다 그게 더 적합하다. 스파 스 구조의 경우에 유용하며 코드를 다소 단순화/가속화 할 수 있습니다.

1

답변에 대한 조언을 기다리고. 예를 들어 당신의 showGraph 방법은 다음과 같습니다 요청 removeVertex 당신이 질문() 방법이다

def showGraph(self): 
    for i, row in enumerate(self.matrix, 1): 
     print i, row 
관련 문제