-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
77 lines (69 loc) · 2.21 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Println("\x1b[42m------------------------------\x1b[0m")
fmt.Println("\x1b[42mDijkstra Grafo Generator 2000 \x1b[0m")
fmt.Println("\x1b[42m------------------------------\x1b[0m\n")
fmt.Print("É um grafo dirigido?[yes/no]\n")
resp, _, _ := reader.ReadLine()
var dirigido bool
if string(resp) == "yes" {
fmt.Println("Ok! teremos um grafico dirigido.")
dirigido = true
}
g := CriarGrafo(dirigido)
fmt.Print("Quantos vertices?")
resp, _, _ = reader.ReadLine()
vertices, err := strconv.Atoi(string(resp))
if err != nil {
fmt.Println("NÚMERO INVALIDO")
os.Exit(1)
}
fmt.Printf("\n\nAdicionando %d vertices :\n", vertices)
for i := 0; i < vertices; i++ {
fmt.Printf("%c,", 'a'+i)
g.AdicionarVertice()
}
fmt.Println("\n\nVamos adicionar as arestas!")
fmt.Println("Basta digitar \"[VerticeDeEntrada],[VerticeDeSaida],[Peso]\"")
fmt.Println("Exemplo: \x1b[35m\"a,b,2\"\x1b[0m (se o peso for 1, pode omitir)")
fmt.Println("Para finalizar digite ok")
for resp, _, err := reader.ReadLine(); string(resp) != "ok" && err == nil; resp, _, err = reader.ReadLine() {
respStr := string(resp)
respostas := strings.Split(respStr, ",")
switch len(respostas) {
case 2:
g.AdicionarAresta(g.vertices[respostas[0][0]-'a'], g.vertices[respostas[1][0]-'a'], 1)
case 3:
peso, _ := strconv.Atoi(respostas[2])
g.AdicionarAresta(g.vertices[respostas[0][0]-'a'], g.vertices[respostas[1][0]-'a'], int32(peso))
default:
fmt.Println("Não entendi seu padrão ;)")
}
}
fmt.Println("Rodando algoritmo de Dikstra")
start := time.Now()
err = g.Dijkstra()
if err != nil {
fmt.Println("Grafo Invalido")
os.Exit(1)
}
end := time.Now()
elapsed := end.Sub(start)
fmt.Println(g)
fmt.Printf("Tempo total: %d ns\n\n\n", elapsed.Nanoseconds())
fmt.Println("Até qual vertice você quer saber o caminho?")
fmt.Println("Para finalizar digite ok")
for resp, _, err := reader.ReadLine(); string(resp) != "ok" && err == nil; resp, _, err = reader.ReadLine() {
v := g.vertices[resp[0]-'a']
fmt.Printf("Até o nodo %c a estimativa é de %d - %s\n", v.id, v.estimativa, g.MenorCaminho(v))
}
}