【问题标题】:Generate a directed Graph using Python Library any python library使用 Python 库生成有向图 任何 Python 库
【发布时间】:2019-03-13 09:10:46
【问题描述】:

我正在用 Python 实现来自 GeeksForGeeks 的贝尔曼福特算法。我想使用诸如 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) 

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

【问题讨论】:

  • 您可能不一定需要重新发明轮子。看来networkx很适合这个。

标签: python matplotlib plot graph bellman-ford


【解决方案1】:

如果您查看此tutorial 的 networkx,您会发现创建有向图以及绘制它是多么容易。

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

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

这个 Matplotlib tutorial 将告诉你如何将它嵌入到 TK 应用程序中。

【讨论】:

    【解决方案2】:

    ekiim 的文档链接非常有用。这是我为绘制图形所做的代码:

    import networkx as nx  
    import matplotlib.pyplot as plt
    G=nx.DiGraph()
    G.add_node(0),G.add_node(1),G.add_node(2),G.add_node(3),G.add_node(4)
    G.add_edge(0, 1),G.add_edge(1, 2),G.add_edge(0, 2),G.add_edge(1, 4),G.add_edge(1, 3),G.add_edge(3, 2),G.add_edge(3,1),G.add_edge(4,3)
    nx.draw(G, with_labels=True, font_weight='bold')
    plt.show()
    

    此代码免费打印有向图。我尝试使用成本进行打印,但由于成本混乱,输出严重失真。有些成本写在空白处,而边缘只有一两个。因此,如果有人知道实现它将非常有用。

    【讨论】:

      猜你喜欢
      • 2013-03-08
      • 1970-01-01
      • 2010-11-12
      • 2011-09-20
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      相关资源
      最近更新 更多