怎么在图上标注出两点间所有路径呢


def main3():
          
           # 建立带权图
             G = nx.Graph()
 
# 向图中添加边,每条边都有一个权值
             G.add_edge('A', 'B', weight=5)
             G.add_edge('A', 'C', weight=3)
             G.add_edge('A', 'D', weight=2)
             G.add_edge('B', 'C', weight=1)
             G.add_edge('B', 'D', weight=2)
             G.add_edge('C', 'D', weight=4)
 
# 查找从点 A 到点 B 的所有路径
             source=nameEntry3.get()
             target=nameEntry4.get()
             all_paths = nx.all_simple_paths(G,source, target)
             
             
 
# 记录路径与权重和
             all_paths_with_weight = {}
             for path in all_paths:
                  weight_sum = 0
                  for i in range(len(path)-1):
                    source = path[i]
                    target = path[i+1]
                    weight = G.get_edge_data(source, target)['weight']
                    weight_sum += weight
                  all_paths_with_weight[str(path)] = weight_sum
    
# 排序
             return sorted(all_paths_with_weight.items(),key = lambda x:x[1],reverse = False)
             fig = plt.figure(figsize=(5, 5))
             canvas = FigureCanvasTkAgg(fig, master=window5)
             canvas.get_tk_widget().grid(row=8, column=11)
        
 
          # 在 Tkinter 用户界面中绘制图
         
             ax = fig.add_subplot(111)
             pos = {'A': (0, 2), 'B': (1, 2), 'C': (0, 1), 'D': (1, 1), 'E': (0, 0), 'F': (1, 0),'G':(2,0),'K':(3,0)} # 使用 FR 算法排列节点
# 使用 NetworkX 绘制无向图
             nx.draw(G,pos=pos,ax=ax, with_labels=True)
 
# 遍历路径上的所有点,在图上标注路径
          # 绘制图像
             edgeList = []
             for i in range(len(all_paths)-1):
                  edgeList.append((all_paths[i], all_paths[i+1]))
                  nx.draw_networkx_edges(G, pos, edgelist=edgeList, edge_color='m', width=4,ax=ax)
             plt.show()
        
        

怎么在图上标注出两点间所有路径呢?

你代码里已经使用 nx.all_simple_paths(G,source, target) 函数查找了从点 A 到点 B 的所有简单路径。

  • 可以在循环中遍历这些路径,并将它们转换为一个边列表 edgeList。
  • 然后,可以使用 NetworkX 的 nx.draw_networkx_edges(G, pos, edgelist=edgeList, edge_color='m', width=4,ax=ax) 函数将这些边绘制到图上。
    • 其中 edgelist=edgeList 传入的就是边的列表,edge_color='m'是边的颜色, width=4是边的粗细

具体说来,可以在下述位置

             edgeList = []
             for i in range(len(all_paths)-1):
                  edgeList.append((all_paths[i], all_paths[i+1]))
                  nx.draw_networkx_edges(G, pos, edgelist=edgeList, edge_color='m', width=4,ax=ax)
             plt.show()

将循环放入,就能在图上标注出所有路径了。