问答社区
在 Graph 结构体中,我们使用两个映射来存储所有的节点和边
下面是一个简单的示例,展示了如何创建一个包含属性的有向图。在这个例子中,我们使用字典来存储每个节点和边的属性。
```go
type Node struct {
ID int
Attr map[string]interface{}
}
type Edge struct {
From int
To int
Attr map[string]interface{}
}
type Graph struct {
Nodes map[int]Node
Edges map[int]Edge
}
```
然后你可以定义一个函数来添加节点和边,并且可以为它们提供属性:
```go
func (g *Graph) AddNode(id int, attr map[string]interface{}) {
node := Node{ID: id, Attr: attr}
g.Nodes[id] = node
}
func (g *Graph) AddEdge(from int, to int, attr map[string]interface{}) {
edge := Edge{From: from, To: to, Attr: attr}
g.Edges[from] = append(g.Edges[from], edge)
}
```
这样,你就可以很容易地添加具有属性的节点和边了。例如:
```go
graph := &Graph{
Nodes: make(map[int]Node),
Edges: make(map[int][]Edge),
}
// 添加一个具有属性的节点
graph.AddNode(1, map[string]interface{}{"name": "node1", "color": "red"})
// 添加一个从节点1到节点2的边,这个边也具有属性
graph.AddEdge(1, 2, map[string]interface{}{"weight": 0.5})
```
请注意,这只是一个基本的示例,实际的实现可能会更复杂,例如需要处理重复的节点或边,或者需要更复杂的查找和遍历算法等。