complete Dijkstra Algorithm : check another example = correct
Showing
1 changed file
with
54 additions
and
7 deletions
| ... | @@ -59,9 +59,13 @@ def Kruskal(graph) : | ... | @@ -59,9 +59,13 @@ def Kruskal(graph) : |
| 59 | 59 | ||
| 60 | return F | 60 | return F |
| 61 | 61 | ||
| 62 | -#Dijkstra Algorithm : input = graph | 62 | +#Dijkstra Algorithm : input = graph / output : F = saving arc, save_length = minimum length |
| 63 | -def dijkstra(w) : | 63 | +def Dijkstra(w, save_length) : |
| 64 | + # n = size of w | ||
| 64 | n = len(w) | 65 | n = len(w) |
| 66 | + #initialize save_length | ||
| 67 | + for i in range(0, n) : | ||
| 68 | + save_length.append(0) | ||
| 65 | 69 | ||
| 66 | #touch[i] = v1에서 vi로 가기 위한 최단 경로상의 마지막 정점, 즉 v(i-1) | 70 | #touch[i] = v1에서 vi로 가기 위한 최단 경로상의 마지막 정점, 즉 v(i-1) |
| 67 | touch = list() | 71 | touch = list() |
| ... | @@ -71,8 +75,40 @@ def dijkstra(w) : | ... | @@ -71,8 +75,40 @@ def dijkstra(w) : |
| 71 | length.append(0) | 75 | length.append(0) |
| 72 | 76 | ||
| 73 | for i in range(1, n) : | 77 | for i in range(1, n) : |
| 74 | - touch[i] = i | 78 | + touch.append(0) |
| 75 | - length[i] = w[0][i] | 79 | + length.append(w[0][i]) |
| 80 | + | ||
| 81 | + #F = output | ||
| 82 | + F = set() | ||
| 83 | + | ||
| 84 | + #repeat (n - 1) times | ||
| 85 | + index = 0 | ||
| 86 | + while index < n - 1 : | ||
| 87 | + min = 1000 #min = infinite | ||
| 88 | + #initialize vnear : 0 | ||
| 89 | + vnear = 0 | ||
| 90 | + for i in range(1, n) : | ||
| 91 | + if (length[i] >= 0 and length[i] < min) : | ||
| 92 | + min = length[i] | ||
| 93 | + vnear = i | ||
| 94 | + | ||
| 95 | + #F에 이음선 e = (touch[vnear], vnear)를 추가한다. | ||
| 96 | + F.add((touch[vnear], vnear)) | ||
| 97 | + | ||
| 98 | + for i in range(1, n) : | ||
| 99 | + if(length[vnear] + w[vnear][i] < length[i]) : | ||
| 100 | + length[i] = length[vnear] + w[vnear][i] | ||
| 101 | + touch[i] = vnear | ||
| 102 | + #이미 vnear를 거쳐간 이후에는 save_length를 더이상 업데이트 할 필요가 없다. | ||
| 103 | + if(length[i] >= 0) : | ||
| 104 | + save_length[i] = length[i] | ||
| 105 | + | ||
| 106 | + | ||
| 107 | + length[vnear] = -1 | ||
| 108 | + index += 1 | ||
| 109 | + | ||
| 110 | + return F | ||
| 111 | + | ||
| 76 | 112 | ||
| 77 | 113 | ||
| 78 | 114 | ||
| ... | @@ -91,11 +127,22 @@ graph = { | ... | @@ -91,11 +127,22 @@ graph = { |
| 91 | ]) | 127 | ]) |
| 92 | } | 128 | } |
| 93 | 129 | ||
| 94 | -#mst = result of applying Kruskal Algorithm | 130 | +#kruskal = result of applying Kruskal Algorithm |
| 95 | -mst = Kruskal(graph) | 131 | +kruskal = Kruskal(graph) |
| 96 | -print('Kruskal Algorithm : ', "\n", mst) | 132 | +print('Kruskal Algorithm : \n', kruskal) |
| 133 | + | ||
| 134 | +print('\n') | ||
| 135 | + | ||
| 97 | 136 | ||
| 98 | #Dijkstra Algorithm | 137 | #Dijkstra Algorithm |
| 99 | inf = 1000 | 138 | inf = 1000 |
| 100 | w = [[0,7,4,6,1],[inf,0,inf,inf,inf], | 139 | w = [[0,7,4,6,1],[inf,0,inf,inf,inf], |
| 101 | [inf,2,0,5,inf], [inf,3,inf,0,inf], [inf,inf,inf,1,0]] | 140 | [inf,2,0,5,inf], [inf,3,inf,0,inf], [inf,inf,inf,1,0]] |
| 141 | + | ||
| 142 | +#save_length : saving minimum length | ||
| 143 | +save_length = list() | ||
| 144 | + | ||
| 145 | +dijkstra = Dijkstra(w, save_length) | ||
| 146 | +print('Dijkstra Algorithm : \n', dijkstra) | ||
| 147 | +print('Dijkstra Length : \n', save_length) | ||
| 148 | + | ... | ... |
-
Please register or login to post a comment