Newer
Older
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package dijkstra
type Topology struct {
nodes []Node
edges map[Node]map[Node]int64
}
type Node struct {
Name string
}
type Edge struct {
NodeA Node
NodeB Node
Distance int64
}
type SPT map[Node]Path
type Path struct {
Edges []Edge
Distance int64
}
// NewTopologay creates a new topology
func NewTopologay(nodes []Node, edges []Edge) *Topology {
t := &Topology{
nodes: nodes,
edges: make(map[Node]map[Node]int64),
}
for _, e := range edges {
if _, ok := t.edges[e.NodeA]; !ok {
t.edges[e.NodeA] = make(map[Node]int64)
}
t.edges[e.NodeA][e.NodeB] = e.Distance
}
return t
}
// SPT calculates the shortest path tree
func (t *Topology) SPT(from Node) *SPT {
spt := make(SPT)
for _, n := range t.nodes {
spt[n] = Path{
Edges: make([]Edge, 0),
Distance: -1,
}
}
f := spt[from]
f.Distance = 0
spt[from] = f
baseDistance := int64(0)
for n, d := range t.edges[from] {
nPath := spt[n]
if nPath.Distance < 0 {
nPath.Distance = d
nPath.Edges = []Edge{
{
NodeA: from,
NodeB: n,
Distance: d,
},
}
spt[n] = nPath
continue
}
if spt[n].Distance < baseDistance+d {
continue
}
nPath.Distance += d
nPath.Edges = []Edge{
{
NodeA: from,
NodeB: n,
Distance: d,
},
}
}
return &spt
}