我正在 Python 中从 GeeksForGeeks 实现 Bellman Ford 的算法。我想使用一些库(如 pyplot 或 networkx 或类似的东西)生成图形(图表形式而不是字典类型 - 这很容易)。我希望图形 UI 包含节点、边和各自的成本。

from collections import defaultdict

#Class to represent a graph
class Graph:

    def __init__(self,vertices):
        self.V= vertices #No. of vertices
        self.graph = [] # default dictionary to store graph

    # function to add an edge to graph
    def addEdge(self,u,v,w):
        self.graph.append([u, v, w])

    # utility function used to print the solution
    def printArr(self, dist):
        print("Vertex   Distance from Source")
        for i in range(self.V):
            print("%d \t\t %d" % (i, dist[i]))

    # The main function that finds shortest distances from src to
    # all other vertices using Bellman-Ford algorithm.  The function
    # also detects negative weight cycle
    def BellmanFord(self, src):

        # Step 1: Initialize distances from src to all other vertices
        # as INFINITE
        dist = [float("Inf")] * self.V
        dist[src] = 0


        # Step 2: Relax all edges |V| - 1 times. A simple shortest
        # path from src to any other vertex can have at-most |V| - 1
        # edges
        for i in range(self.V - 1):
            # Update dist value and parent index of the adjacent vertices of
            # the picked vertex. Consider only those vertices which are still in
            # queue
            for u, v, w in self.graph:
                if dist[u] != float("Inf") and dist[u] + w < dist[v]:
                        dist[v] = dist[u] + w

        # Step 3: check for negative-weight cycles.  The above step
        # guarantees shortest distances if graph doesn't contain
        # negative weight cycle.  If we get a shorter path, then there
        # is a cycle.

        for u, v, w in self.graph:
                if dist[u] != float("Inf") and dist[u] + w < dist[v]:
                        print "Graph contains negative weight cycle"
                        return

        # print all distance
        self.printArr(dist)

g = Graph(5)
g.addEdge(0, 1, -1)
g.addEdge(0, 2, 4)
g.addEdge(1, 2, 3)
g.addEdge(1, 3, 2)
g.addEdge(1, 4, 2)
g.addEdge(3, 2, 5)
g.addEdge(3, 1, 1)
g.addEdge(4, 3, -3)

我想要在终端或单独文件中的图形是(基于上面的代码):

python - 使用 Python 库任何 Python 库生成有向图-LMLPHP

最佳答案

如果你检查这个 tutorial for networkx,你会看到创建一个有向图是多么容易,加上,绘制它。

几乎,有向图或简单图是一样的,(API 明智的),并且绘图也很简单,并使用 Matplotlib 生成它。

你可以制作一个 Tk 应用程序,它允许你手动输入节点和边,并将它们存储在列表框中,并绘制一个图形,在此功能中,这不会是拖放,但它仍然有帮助您可以即时可视化图表。

和这个 Matplotlib tutorial ,会给你一个想法如何将它嵌入到 TK 应用程序中。

关于python - 使用 Python 库任何 Python 库生成有向图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52706635/

10-16 19:57