You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* 1 para todos - Arestas de pesos não negativo - Algoritmo guloso
8
+
* Encontra o caminho mais curto de um vértice (inicio) a outro (destino)
9
+
*
10
+
* Grafo com 5 vértices e 6 arestas
11
+
*
12
+
* 6
13
+
* (0)-----------------(1)
14
+
* | |
15
+
* 10 | | 2
16
+
* | 1 |
17
+
* (2)-----------------(3)
18
+
* \ /
19
+
* 3 \ / 8
20
+
* \ /
21
+
* -----(4)-----
22
+
*
23
+
* Matriz de Distância
24
+
* 0 1 2 3 4
25
+
* 0 0 6 10 - -
26
+
* 1 6 0 - 2 -
27
+
* 2 10 - 0 1 3
28
+
* 3 - 2 1 0 8
29
+
* 4 - - 3 8 0
30
+
*
31
+
* O objetivo é sair do ponto inicial (0) e chegar ao destino (4) pelo caminho mais curto
32
+
* Resposta: (0)->(1)->(3)->(2)->(4) = 12
33
+
*
34
+
* link do código no Go Playground: https://play.golang.org/p/jbi92YkxmMa
35
+
*/
36
+
37
+
package main
38
+
39
+
import (
40
+
"fmt"
41
+
)
42
+
43
+
varnroVerticesint=5
44
+
45
+
typeMatriz [][]int
46
+
47
+
varmaxInt=4294967295
48
+
49
+
// Algoritmo de Dijkstra recebe como parâmetro a matriz de distância e o número de vértices
50
+
funcDijkstra(matrizMatriz, nint) {
51
+
visitados:=make([]bool, n) // Variável que guarda true para os vértices visitados
52
+
// O valor 'i' do for abaixo não é utilizado, pois o for serve apenas para percorrer todo o número de colunas da matriz
53
+
fori:=1; i<n; i++ { // Começa em 1 pois não precisa comparar o vértice com ele mesmo
54
+
55
+
min:=-1// Variável que guarda a posição do menor valor, inicia em -1 pois é uma posição inválida
56
+
minValor:=maxInt// Variável que guarda o menor valor encontrado, inicia com 'infinito', assim, sempre na primeira passada o valor será menor que esta variável
57
+
58
+
// For que percorre todas as linhas na coluna [0]
59
+
forj:=1; j<n; j++ {
60
+
// Se o vertice ainda não foi visitado e o valor for menor que o 'MinValor'
61
+
if!visitados[j] &&matriz[j][0] <minValor {
62
+
min=j// Guarda a posição do menor
63
+
minValor=matriz[j][0] // Guarda o menor valor
64
+
}
65
+
}
66
+
67
+
visitados[min] =true// Marca o valor a posição do minimo como visitado
68
+
69
+
// For de 1 até n
70
+
forj:=1; j<n; j++ {
71
+
// Se o valor da coluna [0] + o valor da coluna que está passando for menor que o valor da linha que está passando e coluna [0]
72
+
// Atualiza a primeira coluna da matriz, que será utilizado para as próximas iterações
73
+
if (matriz[min][0] +matriz[min][j]) <matriz[j][0] {
74
+
matriz[j][0] =matriz[min][0] +matriz[min][j]
75
+
}
76
+
}
77
+
}
78
+
}
79
+
80
+
funcmain() {
81
+
matriz:=Matriz{
82
+
{0, 6, 10, 4294967295, 4294967295},
83
+
{6, 0, 4294967295, 2, 4294967295},
84
+
{10, 4294967295,0, 1, 3},
85
+
{4294967295, 2, 1, 0, 8},
86
+
{4294967295, 4294967295, 3, 8, 0},
87
+
}
88
+
89
+
Dijkstra(matriz, nroVertices)
90
+
91
+
fmt.Printf("Total caminho mais curto do vertice 0 ao 4: %v\n\n", matriz[4][0]) // Caminho total mais curto
0 commit comments