2014-01-28 3 views
1

В последнее время я узнал о теории графов, и я пытаюсь реализовать алгоритм Крускаля, чтобы найти мин. охватывая дерево в графе, используя весовую матрицу. Я получил правильный результат для матрицы и ошибку из-за ошибки для другого! Это дало мне ошибку для:Алгоритм Kruskal's в Python

[[1000,16,12,21,1000,1000,1000],[16,1000,1000,17,20,1000,1000],[12,1000,1000,28,1000,31,1000],[21,17,28,1000,18,19,23],[1000,20,1000,18,1000,1000,11],[1000,1000,31,19,1000,1000,27],[1000,1000,1000,23,11,27,1000]] 

Матрицы, для которых я получил правильный ответ является один ниже: (Примечание: 1000 используется для обозначения веса бесконечности

vertices=5 
spset=[True]*5 
wt=[[1000,1,3,4,1000],[1,1000,5,1000,7],[3,5,1000,6,8],[4,1000,6,1000,2],[1000,7,8,2,1000]] 


row=[0] 

for i in xrange(vertices-1): 
    row_num,col_num,min_no=-1,-1,1000 
    for i in row: 
    temp=min(wt[row[i]]) 
    if(min_no>temp): 
     min_no=temp 
     row_num=i 
     col_num=wt[i].index(temp) 
    print str(min_no)+"("+str(row_num)+","+str(col_num)+")" 
    spset[col_num]=False 
    wt[col_num][row_num]=1000 
    for i in xrange(vertices): 
    wt[i][col_num]=1000 
    row.append(col_num) 

d=raw_input() 
+5

Подсказка. Избегайте пробела в коде, чтобы он не работал быстрее. Это просто усложняет чтение :-) –

ответ

2

В следующий код блока,

for i in row: 
    temp=min(wt[row[i]]) 

i является итерируемым над элементами row. Если row имеет два элемента [0,2], тогда, когда i станет 2, row[i] предоставит IndexError: list index out of range.

Если вы хотите перебрать элементы row, вместо этого используйте for i in range(len(row)).

Смежные вопросы