遍历成对的数组

时间:2019-08-13 21:57:08

标签: go graph

我试图通过一些简单的图形更好地理解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

1 个答案:

答案 0 :(得分:0)

实际上,代码中可以进行很多更改(请查看David Narepaks代码here)。但是,对Walk函数的快速修复可以检查其是否为基本边缘,从而解决了格式设置问题。现在应该使用maing.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)
    }
}