为什么我没有在此代码中获得正确的输出?

时间:2017-11-29 06:14:58

标签: python

def kruskals():
   matrix = []
   total = 0
   min = 999
   u = 0
   v = 0
   parent = [None]*8
   noOfEdges = 1

   for i in range(0,7):
       parent[i] = 0
       for j in range(0,7):
           with open('input.txt') as file:
              for line in file:
                matrix.append([int(val) for val in line.split()])
                #print matrix
                if matrix[i][j]== 0:
                    matrix[i][j] = 999
   while (noOfEdges < 7 ):

      min = 999
      for  i in range(0,7):
            for j in range(0,7):
                    if min > matrix[i][j]:
                        min = matrix[i][j]
                        a = u = i
                        b = v = j
      while (parent[u] != 0):
        u = parent[u]

      while (parent[v] != 0):
        v = parent[v]

      if(v != u):
        noOfEdges = noOfEdges + 1
        print("edge found :{}->{}:{}".format(a,b,min))
        total = total + min
        parent[v] = u
      matrix[u][v] = 999
      matrix[v][u] = 999
    print("The weight of minimum spanning tree is : {}".format(total))
    return
    f.close()

kruskals()

我在python中编写了kruskals算法。我正在从名为&#39; input.txt&#39;的文本文件中获取输入。问题是我得到了正确的值直到某一点,之后输出没有到来。为什么会这样?

输入

&#39; input.txt&#39;:

   0 28 999 999 999 10 999

   28 0 16 999 999 999 14

   999 16 0 12 999 999 999

   999 999 12 0 22 999 18

   999 999 999 22 0 25 24

   10 999 999 999 25 0 999

   999 14 999 18 24 999 999

输出:(直到显示正确)

   edge found :0->5:10

   edge found :2->3:12

   edge found :1->6:14

   edge found :1->2:16

此后输出未显示。&#34;

1 个答案:

答案 0 :(得分:0)

你的循环在6-> 3边缘永远运行(不会打印,因为在生成树中不需要它)。该边缘永远不会在matrix中被清除。您的算法应该清除它检查的每个边缘,但这些行有一个错误:

  matrix[u][v] = 999
  matrix[v][u] = 999

他们应该使用索引ab,而不是uv

正如cricket_007所述,您还遇到了与matrix的创建相关的问题,但事实上,该问题与您提出的问题无关。您目前正在向matrix添加批次数据的额外副本,因为您已经将循环放在嵌套循环内的文件中读取0999。我很确定你只想读一次文件,而不是49次。

将这些线向上移动并移出它们所在的循环:

       with open('input.txt') as file:
          for line in file:
            matrix.append([int(val) for val in line.split()])