以下是一个用Go语言实现的构建有向图的函数。在这个实现中,图由一个map组成,其中键是节点,值是该节点所连接的节点列表。同时,点和边上都可以添加属性。
go复制代码
package main | |
import ( | |
"fmt" | |
) | |
// Edge 结构体表示有向图的边 | |
type Edge struct { | |
To string // 边的终点 | |
Attrs map[string]interface{} // 边属性 | |
} | |
// Graph 结构体表示有向图 | |
type Graph map[string][]Edge | |
// NewGraph 创建一个新的有向图 | |
func NewGraph() Graph { | |
return make(map[string][]Edge) | |
} | |
// AddNode 添加一个节点到图中 | |
func (g Graph) AddNode(name string) { | |
g[name] = []Edge{} | |
} | |
// AddEdge 添加一条边到图中 | |
func (g Graph) AddEdge(from, to string, attrs map[string]interface{}) { | |
edge := Edge{To: to, Attrs: attrs} | |
g[from] = append(g[from], edge) | |
} | |
// PrintGraph 打印图的内容 | |
func (g Graph) PrintGraph() { | |
for node, edges := range g { | |
fmt.Printf("Node: %s\n", node) | |
for _, edge := range edges { | |
fmt.Printf(" Edge to %s with attributes: %v\n", edge.To, edge.Attrs) | |
} | |
} | |
} | |
func main() { | |
graph := NewGraph() | |
// 添加节点和边 | |
graph.AddNode("A") | |
graph.AddNode("B") | |
graph.AddNode("C") | |
graph.AddEdge("A", "B", map[string]interface{}{"weight": 2}) | |
graph.AddEdge("A", "C", map[string]interface{}{"weight": 3}) | |
graph.AddEdge("B", "C", map[string]interface{}{"weight": 4}) | |
// 打印图的内容 | |
graph.PrintGraph() | |
} |
在这个例子中,我们创建了一个名为Edge的结构体来表示有向图的边,它包含一个To字段表示边的终点,以及一个Attrs字段表示边的属性。然后我们创建了一个名为Graph的结构体来表示有向图,它是一个map,键是节点的名字,值是该节点所连接的边的列表。AddNode方法用于添加一个节点到图中,AddEdge方法用于添加一条边到图中。最后,我们有一个PrintGraph方法用于打印图的内容。在main函数中,我们创建了一个新的图,添加了一些节点和边,然后打印了图的内容。