我试图通过一些简单的图形更好地理解golang。我正在尝试上一堂课,但我真的无法弄清楚。事情是我知道解决方案非常简单。我试图通过阅读边缘来打印每个单独的路径。
我已经玩了很多代码,这实际上是我能得到的最简单的形式。
package main
import "fmt"
type Graph struct {
Edges map[string][]string
}
// NewGraph: Create graph with n nodes.
func NewGraph() *Graph {
return &Graph{
Edges: make(map[string][]string),
}
}
// AddEdge: Add an edge from u to v.
func (g *Graph) AddEdge(u, v string) {
g.Edges[u] = append(g.Edges[u], v)
}
func (g *Graph) Walk(u string) {
for _, v := range g.Edges[u] {
fmt.Printf("%s -> %s", u, v)
g.Walk(v)
}
}
func (g *Graph) adjacentEdgesExample() {
fmt.Println("Printing all edges in graph.")
for u, adjacent := range g.Edges { // Nodes are labelled 0 to N-1.
for _, v := range adjacent {
// Edge exists from u to v.
fmt.Printf("Edge: %s -> %s\n", u, v)
}
}
}
func main() {
g := NewGraph()
g.AddEdge("A", "B")
g.AddEdge("A", "D")
g.AddEdge("D", "E")
g.AddEdge("B", "C")
g.adjacentEdgesExample()
fmt.Println(g.Edges)
g.Walk("A")
}
示例在:
https://goplay.space/#Ro1puZYgu5X
其结果为:
Printing all edges in graph.
Edge: B -> C
Edge: A -> B
Edge: A -> D
Edge: D -> E
map[A:[B D] B:[C] D:[E]]
A -> BB -> CA -> DD -> E%
我想看看Walk方法做这样的事情:
A -> B -> C
A -> D -> E
答案 0 :(得分:0)
实际上,代码中可以进行很多更改(请查看David Narepaks代码here)。但是,对Walk
函数的快速修复可以检查其是否为基本边缘,从而解决了格式设置问题。现在应该使用main
从g.Walk("A", true)
调用它。
func (g *Graph) Walk(u string, f bool) {
for _, v := range g.Edges[u] {
if f == true {
fmt.Printf("\n%s -> %s", u, v)
} else {
fmt.Printf(" -> %s", v)
}
g.Walk(v, false)
}
}
编辑
视情况,您可以只检查f
,然后将u相应地设置为"\n + u"
:
func (g *Graph) Walk(u string, f bool) {
for _, v := range g.Edges[u] {
if f {
u = "\n" + u
} else {
u = ""
}
fmt.Printf("%s -> %s", u, v)
g.Walk(v, false)
}
}