Skip to content

Commit d2b9419

Browse files
committed
Adiciona algoritmo de Dirjkstra em Go
1 parent 1d58e2d commit d2b9419

File tree

2 files changed

+121
-1
lines changed

2 files changed

+121
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Com o objetivo de alcançar uma abrangência maior e encorajar novas pessoas a c
66

77
| Algoritmos | C/C++ | Java | Python | Go | Ruby | Javascript | Pascal |
88
|-------------------------------------|-------|------|--------|----|------|------------|--------|
9-
| [Algoritmo Dijkstra][1] | [C/C++](/src/c/AlgoritmoDijkstra.c) | Java | Python | Go | Ruby | [Javascript](src/javascript/AlgoritmoDijkstra.js) | Pascal |
9+
| [Algoritmo Dijkstra][1] | [C/C++](/src/c/AlgoritmoDijkstra.c) | Java | Python | [Go](/src/go/dirjkstra/dirjkstra.go) | Ruby | [Javascript](src/javascript/AlgoritmoDijkstra.js) | Pascal |
1010
| [Algoritmo Floyd Warshall][2] | [C/C++](/src/c/AlgoritmoFloydWarshall.c) | Java | Python | Go | Ruby | Javascript | Pascal |
1111
| [Busca Binária][5] | [C/C++](/src/c/BinarySearch.cpp) | Java | [Python](/src/python/busca_binaria.py) | Go | [Ruby](/src/ruby/BuscaBinaria.rb) | [Javascript](/src/javascript/BinarySearch.js) | [Pascal](/src/pascal/busca-binaria.pas) |
1212
| [Busca em Grafos][6] | [C/C++](/src/c/BuscaEmGrafo.c) | Java | Python | Go | Ruby | [Javascript](/src/javascript/GraphSearch.js) | Pascal |

src/go/dirjkstra/dirjkstra.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/*
2+
* Grafos - Algoritmo de Dijkstra em Go
3+
* Danilo Moura - 2020
4+
* Complexidade: Teta(n^2)
5+
* Implementação utilizando matriz de adjacências
6+
*
7+
* 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+
var nroVertices int = 5
44+
45+
type Matriz [][]int
46+
47+
var maxInt = 4294967295
48+
49+
// Algoritmo de Dijkstra recebe como parâmetro a matriz de distância e o número de vértices
50+
func Dijkstra(matriz Matriz, n int) {
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+
for i := 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+
for j := 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+
for j := 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+
func main() {
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
92+
93+
// Da print na matriz com os valores atualizados
94+
fmt.Println("Matriz:")
95+
96+
firstLoopI := true
97+
for i := 0; i < nroVertices; i++ {
98+
for j := 0; j < nroVertices; j++ {
99+
if firstLoopI {
100+
fmt.Printf("- 0 1 2 3 4\n")
101+
fmt.Println()
102+
}
103+
104+
if j == 0 {
105+
fmt.Printf("%v|", i)
106+
}
107+
108+
if matriz[i][j] == maxInt {
109+
fmt.Printf(" inf")
110+
} else {
111+
fmt.Printf(" %v", matriz[i][j])
112+
}
113+
114+
firstLoopI = false
115+
}
116+
fmt.Println()
117+
}
118+
fmt.Println()
119+
}
120+

0 commit comments

Comments
 (0)