Skip to content

Commit a6e7c62

Browse files
committedFeb 2, 2020
add digraph
1 parent c3840cf commit a6e7c62

File tree

2 files changed

+127
-0
lines changed

2 files changed

+127
-0
lines changed
 

‎cmd/digraph/main.go

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
Execution: go run cmd/digraph/main.go input.txt
3+
Dependencies: Bag.java Stack.java In.java StdOut.java
4+
Data files: https://algs4.cs.princeton.edu/41graph/tinyDG.txt
5+
https://algs4.cs.princeton.edu/41graph/mediumDG.txt
6+
https://algs4.cs.princeton.edu/41graph/largeDG.txt
7+
8+
A graph, implemented using an array of sets.
9+
Parallel edges and self-loops are permitted.
10+
11+
% go run cmd/digraph/main.go < tinyDG.txt
12+
13 vertices, 22 edges
13+
0: 5 1
14+
1:
15+
2: 0 3
16+
3: 5 2
17+
4: 3 2
18+
5: 4
19+
6: 9 4 8 0
20+
7: 6 9
21+
8: 6
22+
9: 11 10
23+
10: 12
24+
11: 4 12
25+
12: 9
26+
*/
27+
28+
package main
29+
30+
import (
31+
"fmt"
32+
"os"
33+
34+
"github.com/shellfly/algo"
35+
"github.com/shellfly/algo/stdin"
36+
)
37+
38+
func main() {
39+
graph := algo.NewDigraph(stdin.NewIn(os.Args[1]))
40+
fmt.Println(graph)
41+
}

‎digraph.go

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

0 commit comments

Comments
 (0)