Skip to content

Commit ede14b1

Browse files
committed
add edge weighted digraph
1 parent 5bc0538 commit ede14b1

File tree

4 files changed

+169
-0
lines changed

4 files changed

+169
-0
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ To test each algorithm(data structure), instead of running the file directly, yo
7272
* [LazyPrimMST](lazy_prim_mst.go)
7373
* [PrimMST](prim_mst.go)
7474
* [KruskalMST](kruskal_mst.go)
75+
* Shortest Paths
76+
* [EdgeWeightedDigraph](edge_weighted_digraph.go)
7577

7678
* 5 STRING
7779

cmd/edge-weighted-digraph/main.go

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/******************************************************************************
2+
* Execution: go run cmd/edge-weighted-graph/main.go filename.txt
3+
* Data files: https://algs4.cs.princeton.edu/43mst/tinyEWG.txt
4+
* https://algs4.cs.princeton.edu/43mst/mediumEWG.txt
5+
* https://algs4.cs.princeton.edu/43mst/largeEWG.txt
6+
*
7+
* An edge-weighted undirected graph, implemented using adjacency lists.
8+
* Parallel edges and self-loops are permitted.
9+
*
10+
* % go run cmd/edge-weighted-graph/main.go tinyEWG.txt
11+
* 8 16
12+
* 0: 6-0 0.58000 0-2 0.26000 0-4 0.38000 0-7 0.16000
13+
* 1: 1-3 0.29000 1-2 0.36000 1-7 0.19000 1-5 0.32000
14+
* 2: 6-2 0.40000 2-7 0.34000 1-2 0.36000 0-2 0.26000 2-3 0.17000
15+
* 3: 3-6 0.52000 1-3 0.29000 2-3 0.17000
16+
* 4: 6-4 0.93000 0-4 0.38000 4-7 0.37000 4-5 0.35000
17+
* 5: 1-5 0.32000 5-7 0.28000 4-5 0.35000
18+
* 6: 6-4 0.93000 6-0 0.58000 3-6 0.52000 6-2 0.40000
19+
* 7: 2-7 0.34000 1-7 0.19000 0-7 0.16000 5-7 0.28000 4-7 0.37000
20+
*
21+
******************************************************************************/
22+
23+
package main
24+
25+
import (
26+
"fmt"
27+
"os"
28+
29+
"github.com/shellfly/algo"
30+
"github.com/shellfly/algo/stdin"
31+
)
32+
33+
func main() {
34+
graph := algo.NewEdgeWeightedGraph(stdin.NewIn(os.Args[1]))
35+
fmt.Println(graph)
36+
}

directed_edge.go

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package algo
2+
3+
import "fmt"
4+
5+
// DirectedEdge is a ADT for DirectedEdgeWeightedGraph
6+
type DirectedEdge struct {
7+
v, w int
8+
weight float32
9+
}
10+
11+
// NewDirectedEdge ...
12+
func NewDirectedEdge(v, w int, weight float32) *DirectedEdge {
13+
return &DirectedEdge{v, w, weight}
14+
}
15+
16+
// Weight ...
17+
func (e *DirectedEdge) Weight() float32 {
18+
return e.weight
19+
}
20+
21+
// From ...
22+
func (e *DirectedEdge) From() int {
23+
return e.v
24+
}
25+
26+
// To ...
27+
func (e *DirectedEdge) To() int {
28+
return e.w
29+
}
30+
31+
// String ...
32+
func (e *DirectedEdge) String() string {
33+
return fmt.Sprintf("%d-%d %.5f", e.v, e.w, e.weight)
34+
}
35+
36+
// CompareTo implements PQItem interface
37+
func (e *DirectedEdge) CompareTo(other interface{}) int {
38+
ee := other.(*DirectedEdge)
39+
if e.weight > ee.weight {
40+
return 1
41+
} else if e.weight < ee.weight {
42+
return -1
43+
} else {
44+
return 0
45+
}
46+
}

edge_weighted_digraph.go

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package algo
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/shellfly/algo/stdin"
7+
)
8+
9+
// EdgeWeightedDigraph ...
10+
type EdgeWeightedDigraph struct {
11+
v, e int
12+
adj []*Bag
13+
}
14+
15+
// NewEdgeWeightedDigraph ...
16+
func NewEdgeWeightedDigraph(in *stdin.In) *EdgeWeightedDigraph {
17+
v := in.ReadInt()
18+
adj := make([]*Bag, v)
19+
for i := 0; i < v; i++ {
20+
adj[i] = NewBag()
21+
}
22+
g := &EdgeWeightedDigraph{v: v, e: 0, adj: adj}
23+
e := in.ReadInt()
24+
for i := 0; i < e; i++ {
25+
v, w, weight := in.ReadInt(), in.ReadInt(), in.ReadFloat32()
26+
g.AddEdge(NewDirectedEdge(v, w, weight))
27+
}
28+
return g
29+
}
30+
31+
// NewEdgeWeightedDigraphV ...
32+
func NewEdgeWeightedDigraphV(v int) *EdgeWeightedDigraph {
33+
adj := make([]*Bag, v)
34+
for i := 0; i < v; i++ {
35+
adj[i] = NewBag()
36+
}
37+
return &EdgeWeightedDigraph{v: v, e: 0, adj: adj}
38+
}
39+
40+
// V ...
41+
func (g *EdgeWeightedDigraph) V() int {
42+
return g.v
43+
}
44+
45+
// E ...
46+
func (g *EdgeWeightedDigraph) E() int {
47+
return g.e
48+
}
49+
50+
// AddEdge ...
51+
func (g *EdgeWeightedDigraph) AddEdge(e *DirectedEdge) {
52+
g.adj[e.From()].Add(e.To())
53+
g.e++
54+
}
55+
56+
// Adj ...
57+
func (g *EdgeWeightedDigraph) Adj(v int) []*DirectedEdge {
58+
var items []*DirectedEdge
59+
for _, item := range g.adj[v].Slice() {
60+
items = append(items, item.(*DirectedEdge))
61+
}
62+
return items
63+
}
64+
65+
// Edges ...
66+
func (g *EdgeWeightedDigraph) Edges() (edges []*DirectedEdge) {
67+
for v := 0; v < g.v; v++ {
68+
for _, e := range g.Adj(v) {
69+
edges = append(edges, e)
70+
}
71+
}
72+
return
73+
}
74+
75+
func (g *EdgeWeightedDigraph) String() string {
76+
s := fmt.Sprintf("%d vertices, %d edges\n", g.v, g.e)
77+
for i := 0; i < g.v; i++ {
78+
var adjs string
79+
for _, e := range g.Adj(i) {
80+
adjs = fmt.Sprintf("%s %s ", adjs, e)
81+
}
82+
s += fmt.Sprintf("%d: %s\n", i, adjs)
83+
}
84+
return s
85+
}

0 commit comments

Comments
 (0)