Skip to content
Snippets Groups Projects
Commit 8c20ee1f authored by Oliver Herms's avatar Oliver Herms
Browse files

Splitting PR

parent bdedcbc1
No related branches found
No related tags found
No related merge requests found
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
}
package dijkstra
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestSPT(t *testing.T) {
tests := []struct {
name string
nodes []Node
edges []Edge
expected *SPT
}{
{
name: "Test #1",
nodes: []Node{
{
Name: "A",
},
{
Name: "B",
}, {
Name: "C",
}, {
Name: "D",
},
},
edges: []Edge{
{
NodeA: Node{Name: "A"},
NodeB: Node{Name: "B"},
Distance: 1,
},
{
NodeA: Node{Name: "B"},
NodeB: Node{Name: "A"},
Distance: 1,
},
{
NodeA: Node{Name: "B"},
NodeB: Node{Name: "C"},
Distance: 5,
},
{
NodeA: Node{Name: "C"},
NodeB: Node{Name: "B"},
Distance: 5,
},
{
NodeA: Node{Name: "B"},
NodeB: Node{Name: "D"},
Distance: 1,
},
{
NodeA: Node{Name: "D"},
NodeB: Node{Name: "B"},
Distance: 1,
},
{
NodeA: Node{Name: "A"},
NodeB: Node{Name: "D"},
Distance: 5,
},
{
NodeA: Node{Name: "D"},
NodeB: Node{Name: "A"},
Distance: 5,
},
{
NodeA: Node{Name: "D"},
NodeB: Node{Name: "C"},
Distance: 5,
},
{
NodeA: Node{Name: "C"},
NodeB: Node{Name: "D"},
Distance: 5,
},
},
expected: &SPT{
Node{Name: "A"}: Path{
Edges: []Edge{},
Distance: 0,
},
Node{Name: "B"}: Path{
Edges: []Edge{
{
NodeA: Node{Name: "A"},
NodeB: Node{Name: "B"},
Distance: 1,
},
},
Distance: 1,
},
Node{Name: "C"}: Path{
Edges: []Edge{
{
NodeA: Node{Name: "A"},
NodeB: Node{Name: "B"},
Distance: 1,
},
{
NodeA: Node{Name: "B"},
NodeB: Node{Name: "D"},
Distance: 1,
},
{
NodeA: Node{Name: "D"},
NodeB: Node{Name: "C"},
Distance: 1,
},
},
Distance: 3,
},
Node{Name: "D"}: Path{
Edges: []Edge{
{
NodeA: Node{Name: "A"},
NodeB: Node{Name: "B"},
Distance: 1,
},
{
NodeA: Node{Name: "B"},
NodeB: Node{Name: "D"},
Distance: 1,
},
},
Distance: 2,
},
},
},
}
for _, test := range tests {
top := NewTopologay(test.nodes, test.edges)
spt := top.SPT(Node{Name: "A"})
assert.Equalf(t, test.expected, spt, "Test %q", test.name)
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment