Skip to content

Commit 2210961

Browse files
committed
graph
1 parent fdab90a commit 2210961

File tree

3 files changed

+104
-5
lines changed

3 files changed

+104
-5
lines changed

data-structures/graph/directed_graph.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,14 @@ func NewDirected() *DirGraph {
1515
}
1616
}
1717

18+
//入度
1819
func (g *graph) GetPredecessors(vertex VertexId) VerticesIterable {
1920
iterator := func() <-chan VertexId {
2021
ch := make(chan VertexId)
2122
go func() {
22-
if connected, ok := g.edges[vertex]; ok {
23-
for VertexId, _ := range connected {
24-
if g.CheckEdge(VertexId, vertex) {
25-
ch <- VertexId
26-
}
23+
for VertexId, _ := range g.edges {
24+
if g.CheckEdge(VertexId, vertex) {
25+
ch <- VertexId
2726
}
2827
}
2928
close(ch)
@@ -34,6 +33,7 @@ func (g *graph) GetPredecessors(vertex VertexId) VerticesIterable {
3433
return VerticesIterable(&VerticesIterableHelp{iter: iterator})
3534
}
3635

36+
//出度
3737
func (g *graph) GetSuccessors(vertex VertexId) VerticesIterable {
3838
iterator := func() <-chan VertexId {
3939
ch := make(chan VertexId)

data-structures/graph/graph.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ func (g *graph) RemoveVertex(vertex VertexId) error {
8181
if !g.CheckVertex(vertex) {
8282
return errors.New("unknow vertex")
8383
}
84+
//先删除边
85+
for _to, _ := range g.edges[vertex] {
86+
g.RemoveEdge(vertex, _to)
87+
}
8488
delete(g.edges, vertex)
8589
for _, connectedVertices := range g.edges {
8690
delete(connectedVertices, vertex)
@@ -111,6 +115,10 @@ func (g *graph) AddEdge(from, to VertexId, weight int) error {
111115
if !g.CheckVertex(from) || !g.CheckVertex(to) {
112116
return errors.New("vertices not exist")
113117
}
118+
//判断边存在不
119+
if g.edges[from][to] > 0 {
120+
return errors.New("edge exist")
121+
}
114122
g.edges[from][to] = weight
115123
if !g.isDirected {
116124
g.edges[to][from] = weight

data-structures/graph/graph_test.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,92 @@
11
package graph
2+
3+
import (
4+
"github.com/stretchr/testify/assert"
5+
"testing"
6+
)
7+
8+
func TestNewUndirected(t *testing.T) {
9+
g := NewUndirected()
10+
//增加顶点
11+
for i := 0; i < 10; i++ {
12+
g.AddVertex(VertexId(i))
13+
}
14+
assert.Equal(t, 10, g.VerticesCount())
15+
//增加边
16+
for i := 0; i < 10; i++ {
17+
g.AddEdge(VertexId(i), VertexId(i%2), 1)
18+
}
19+
//
20+
assert.Equal(t, true, g.CheckEdge(2, 0))
21+
assert.Equal(t, false, g.CheckEdge(2, 1))
22+
assert.Equal(t, 1, g.GetEdgeWeight(2, 0))
23+
//删除顶点
24+
assert.NoError(t, g.RemoveVertex(VertexId(2)))
25+
assert.Equal(t, false, g.CheckVertex(VertexId(2)))
26+
assert.Equal(t, false, g.CheckEdge(2, 0))
27+
//增加边,存在修改
28+
assert.NoError(t, g.AddEdge(3, 0, 1))
29+
assert.Equal(t, true, g.CheckEdge(3, 0))
30+
//删除边
31+
assert.NoError(t, g.RemoveEdge(3, 0))
32+
assert.Equal(t, false, g.CheckEdge(3, 0))
33+
34+
//统计边
35+
c := g.EdgesIter()
36+
countEdge := 0
37+
for _ = range c {
38+
countEdge++
39+
}
40+
assert.Equal(t, countEdge, g.EdgesCount())
41+
42+
}
43+
44+
func TestNewDirected(t *testing.T) {
45+
g := NewDirected()
46+
//增加顶点
47+
for i := 0; i < 10; i++ {
48+
g.AddVertex(VertexId(i))
49+
}
50+
assert.Equal(t, 10, g.VerticesCount())
51+
//增加边
52+
for i := 0; i < 10; i++ {
53+
g.AddEdge(VertexId(i), VertexId(i%2), 1)
54+
}
55+
//
56+
assert.Equal(t, true, g.CheckEdge(2, 0))
57+
assert.Equal(t, false, g.CheckEdge(2, 1))
58+
assert.Equal(t, 1, g.GetEdgeWeight(2, 0))
59+
//删除顶点
60+
assert.NoError(t, g.RemoveVertex(VertexId(2)))
61+
assert.Equal(t, false, g.CheckVertex(VertexId(2)))
62+
assert.Equal(t, false, g.CheckEdge(2, 0))
63+
//增加边,存在修改
64+
assert.NoError(t, g.AddEdge(3, 0, 1))
65+
assert.Equal(t, true, g.CheckEdge(3, 0))
66+
//删除边
67+
assert.NoError(t, g.RemoveEdge(3, 0))
68+
assert.Equal(t, false, g.CheckEdge(3, 0))
69+
70+
//统计边
71+
c := g.EdgesIter()
72+
countEdge := 0
73+
for _ = range c {
74+
countEdge++
75+
}
76+
assert.Equal(t, countEdge, g.EdgesCount())
77+
//查看
78+
//for p := range g.EdgesIter() {
79+
// t.Log(p)
80+
//}
81+
//入度
82+
gp := g.GetPredecessors(VertexId(1)).VerticesIter()
83+
for p := range gp {
84+
if p != 3 && p != 5 && p != 7 && p != 9 {
85+
t.Error()
86+
}
87+
}
88+
89+
for p := range g.GetSuccessors(VertexId(4)).VerticesIter() {
90+
assert.Equal(t, VertexId(0), p)
91+
}
92+
}

0 commit comments

Comments
 (0)