graph/simple: separate weighted and unweighted edge implementations

This commit is contained in:
kortschak
2017-08-22 15:53:09 +09:30
parent 7ba61f0ead
commit f739fbf133
27 changed files with 192 additions and 181 deletions

View File

@@ -34,9 +34,9 @@ type spanningGraph interface {
var spanningTreeTests = []struct {
name string
graph func() spanningGraph
edges []simple.Edge
edges []simple.WeightedEdge
want float64
treeEdges []simple.Edge
treeEdges []simple.WeightedEdge
}{
{
name: "Empty",
@@ -49,7 +49,7 @@ var spanningTreeTests = []struct {
// to prevent the alternative solution being found.
name: "Prim WP figure 1",
graph: func() spanningGraph { return simple.NewWeightedUndirectedGraph(0, math.Inf(1)) },
edges: []simple.Edge{
edges: []simple.WeightedEdge{
{F: simple.Node('A'), T: simple.Node('B'), W: 2.5},
{F: simple.Node('A'), T: simple.Node('D'), W: 1},
{F: simple.Node('B'), T: simple.Node('D'), W: 2},
@@ -57,7 +57,7 @@ var spanningTreeTests = []struct {
},
want: 6,
treeEdges: []simple.Edge{
treeEdges: []simple.WeightedEdge{
{F: simple.Node('A'), T: simple.Node('D'), W: 1},
{F: simple.Node('B'), T: simple.Node('D'), W: 2},
{F: simple.Node('C'), T: simple.Node('D'), W: 3},
@@ -67,7 +67,7 @@ var spanningTreeTests = []struct {
// https://upload.wikimedia.org/wikipedia/commons/5/5c/MST_kruskal_en.gif
name: "Kruskal WP figure 1",
graph: func() spanningGraph { return simple.NewWeightedUndirectedGraph(0, math.Inf(1)) },
edges: []simple.Edge{
edges: []simple.WeightedEdge{
{F: simple.Node('a'), T: simple.Node('b'), W: 3},
{F: simple.Node('a'), T: simple.Node('e'), W: 1},
{F: simple.Node('b'), T: simple.Node('c'), W: 5},
@@ -78,7 +78,7 @@ var spanningTreeTests = []struct {
},
want: 11,
treeEdges: []simple.Edge{
treeEdges: []simple.WeightedEdge{
{F: simple.Node('a'), T: simple.Node('b'), W: 3},
{F: simple.Node('a'), T: simple.Node('e'), W: 1},
{F: simple.Node('b'), T: simple.Node('c'), W: 5},
@@ -89,7 +89,7 @@ var spanningTreeTests = []struct {
// https://upload.wikimedia.org/wikipedia/commons/8/87/Kruskal_Algorithm_6.svg
name: "Kruskal WP example",
graph: func() spanningGraph { return simple.NewWeightedUndirectedGraph(0, math.Inf(1)) },
edges: []simple.Edge{
edges: []simple.WeightedEdge{
{F: simple.Node('A'), T: simple.Node('B'), W: 7},
{F: simple.Node('A'), T: simple.Node('D'), W: 5},
{F: simple.Node('B'), T: simple.Node('C'), W: 8},
@@ -104,7 +104,7 @@ var spanningTreeTests = []struct {
},
want: 39,
treeEdges: []simple.Edge{
treeEdges: []simple.WeightedEdge{
{F: simple.Node('A'), T: simple.Node('B'), W: 7},
{F: simple.Node('A'), T: simple.Node('D'), W: 5},
{F: simple.Node('B'), T: simple.Node('E'), W: 7},
@@ -117,7 +117,7 @@ var spanningTreeTests = []struct {
// https://upload.wikimedia.org/wikipedia/commons/2/2e/Boruvka%27s_algorithm_%28Sollin%27s_algorithm%29_Anim.gif
name: "Borůvka WP example",
graph: func() spanningGraph { return simple.NewWeightedUndirectedGraph(0, math.Inf(1)) },
edges: []simple.Edge{
edges: []simple.WeightedEdge{
{F: simple.Node('A'), T: simple.Node('B'), W: 13},
{F: simple.Node('A'), T: simple.Node('C'), W: 6},
{F: simple.Node('B'), T: simple.Node('C'), W: 7},
@@ -141,7 +141,7 @@ var spanningTreeTests = []struct {
},
want: 83,
treeEdges: []simple.Edge{
treeEdges: []simple.WeightedEdge{
{F: simple.Node('A'), T: simple.Node('C'), W: 6},
{F: simple.Node('B'), T: simple.Node('C'), W: 7},
{F: simple.Node('B'), T: simple.Node('D'), W: 1},
@@ -160,7 +160,7 @@ var spanningTreeTests = []struct {
// Nodes labelled row major.
name: "Minimum Spanning Tree WP figure 1",
graph: func() spanningGraph { return simple.NewWeightedUndirectedGraph(0, math.Inf(1)) },
edges: []simple.Edge{
edges: []simple.WeightedEdge{
{F: simple.Node(1), T: simple.Node(2), W: 4},
{F: simple.Node(1), T: simple.Node(3), W: 1},
{F: simple.Node(1), T: simple.Node(4), W: 4},
@@ -185,7 +185,7 @@ var spanningTreeTests = []struct {
},
want: 38,
treeEdges: []simple.Edge{
treeEdges: []simple.WeightedEdge{
{F: simple.Node(1), T: simple.Node(2), W: 4},
{F: simple.Node(1), T: simple.Node(3), W: 1},
{F: simple.Node(2), T: simple.Node(8), W: 7},
@@ -203,7 +203,7 @@ var spanningTreeTests = []struct {
// but with C--H and E--J cut.
name: "Borůvka WP example cut",
graph: func() spanningGraph { return simple.NewWeightedUndirectedGraph(0, math.Inf(1)) },
edges: []simple.Edge{
edges: []simple.WeightedEdge{
{F: simple.Node('A'), T: simple.Node('B'), W: 13},
{F: simple.Node('A'), T: simple.Node('C'), W: 6},
{F: simple.Node('B'), T: simple.Node('C'), W: 7},
@@ -225,7 +225,7 @@ var spanningTreeTests = []struct {
},
want: 65,
treeEdges: []simple.Edge{
treeEdges: []simple.WeightedEdge{
{F: simple.Node('A'), T: simple.Node('C'), W: 6},
{F: simple.Node('B'), T: simple.Node('C'), W: 7},
{F: simple.Node('B'), T: simple.Node('D'), W: 1},