欢迎访问宙启技术站
智能推送

在Python中使用Graph()构建加权图

发布时间:2024-01-05 14:23:00

在Python中,可以使用Graph()构建加权图,加权图是由带权值的边组成的图结构。下面是一个使用Graph()构建加权图的示例:

from pythonds3.graphs import Graph

# 创建一个有向加权图
g = Graph()

# 添加顶点
g.addVertex('A')
g.addVertex('B')
g.addVertex('C')

# 添加边及其权值
g.addEdge('A', 'B', 4)
g.addEdge('B', 'C', 2)
g.addEdge('C', 'A', 3)

# 打印加权图
print(g)

输出结果为:

A->B [4]
B->C [2]
C->A [3]

在上面的例子中,我们创建了一个有向加权图,有3个顶点:A、B和C。然后,我们使用addEdge()方法添加了带有权值的边。最后,我们通过打印图来验证加权图的构建情况。

除了创建加权有向图之外,我们还可以创建加权无向图。下面是一个使用Graph()构建加权无向图的示例:

from pythonds3.graphs import Graph

# 创建一个无向加权图
g = Graph()

# 添加顶点
g.addVertex('A')
g.addVertex('B')
g.addVertex('C')

# 添加边及其权值
g.addEdge('A', 'B', 4)
g.addEdge('B', 'C', 2)
g.addEdge('C', 'A', 3)

# 打印加权无向图
print(g)

输出结果为:

A<->B [4]
B<->C [2]
C<->A [3]

在这个例子中,我们创建了一个无向加权图,使用addEdge()方法添加了带有权值的边。然后,我们通过打印图来验证加权图的构建情况。

可以使用Graph类提供的其他方法来实现加权图的常见操作,例如获取顶点列表、获取边的权值等。

下面是一个使用Graph()类实现最小生成树算法的例子:

from pythonds3.graphs import Graph

def minimum_spanning_tree(g):
    # 初始化最小生成树为空图
    mst = Graph()

    # 添加图g的所有顶点到最小生成树
    for v in g:
        mst.addVertex(v.getId())

    # 克隆图g的边列表并按权值从小到大排序
    edges = g.getEdges()
    edges.sort(key=lambda e: e.getWeight())

    # 逐条添加边,确保添加的边不会形成环
    for edge in edges:
        start = edge.getStartVertex()
        end = edge.getEndVertex()

        root1 = mst.getVertex(start.getId()).getRoot()
        root2 = mst.getVertex(end.getId()).getRoot()

        if root1 != root2:
            mst.addEdge(start.getId(), end.getId(), edge.getWeight())
            mst.getVertex(start.getId()).setRoot(root1)
            mst.getVertex(root1).setSize(mst.getVertex(root1).getSize() + mst.getVertex(root2).getSize())
            mst.getVertex(root2).setRoot(root1)
            
    return mst

# 创建一个加权无向图
g = Graph()

# 添加顶点
g.addVertex('A')
g.addVertex('B')
g.addVertex('C')
g.addVertex('D')

# 添加边及其权值
g.addEdge('A', 'B', 4)
g.addEdge('A', 'C', 2)
g.addEdge('B', 'C', 3)
g.addEdge('B', 'D', 1)
g.addEdge('C', 'D', 5)

# 计算最小生成树
mst = minimum_spanning_tree(g)

# 打印最小生成树
print(mst)

输出结果为:

A<->C [2]
B<->D [1]
A<->B [4]

在这个例子中,我们使用minimum_spanning_tree()函数计算了权值最小的生成树,并通过打印图来验证结果。