当前位置: 首页 > 知识库问答 >
问题:

图中每个节点与列表中元素之间的最短路径

钮勇
2023-03-14

以下数据

Node       Target
Jennifer   Maria
Luke       Mark
Johnny     Martin
Ludo       Martin
Maria      nan
Mark       Luke
Mark       Christopher 

用于构建网络(其中节点是源节点):

G = nx.from_pandas_edgelist(edges, source='Node', target='Target')

我想列出源节点和单独列表中的节点之间的所有最短路径(如果存在):

list4path=['Christopher', 'Donna', 'Julian','Martin']

networkx中有几个计算最短路径的选项(例如,最短路径),但我想知道如何获得每个节点和列表4pth中几个目标之间的所有最短路径(目标列仅用于构建目的)。

共有1个答案

古刚洁
2023-03-14

最简单的方法是使用nx的默认行为。最短路径(G)只要您的网络很小,就不会指定目标参数。如果您只是运行all\u shortest=nx。最短路径(G),根据文档:

如果既没有指定源也没有指定目标,则返回一个字典,字典的路径[源][目标]=[路径中的节点列表]。

然后all_shortest['Luke']['Christopher']将是Luke和Christopher之间的最短路径,或者如果节点之间没有路径,将导致KeyError。或者您可以使用。get()以避免出现键错误。

如果您的网络足够大,只计算具有list4path中目标的路径更为实际,那么您可以执行以下操作:

selected_shortest = {source: {target: nx.shortest_path(G, source, target) for target in list4path if nx.has_path(G, source, target)} for source in G.nodes()}

这将为您提供相同的数据结构,但只计算以list4path中的节点结尾的所需最短路径。

我相信编写一个简单的函数来处理源代码和目标代码之间没有路径的情况会快得多。我刚刚调用了额外的nx。在一个懒散编写的单行程序中包含了_path()函数,但我将把它作为练习留给读者进行优化。^)

 类似资料:
  • Dijkstra算法说 对于图中给定的源节点,算法找到该节点和其他节点之间的最短路径 我得到了算法来找到那个节点和其他节点之间的最短路径。但是我的问题是,如果我需要为Linkedin/facebook这样的大图找到两个特定节点(比如N1和N2)的最短路径,我需要计算该节点N1和领英上其他节点(用户,意味着十亿用户)之间的距离吗首先,将其存储在高速缓存中,然后在询问两个节点的最短距离时从高速缓存中返

  • 我在使最短路径算法正常工作时遇到问题。我有一个20 x 20的2d数组,其中包含表示城市之间道路的边权重。我没有得到城市间最短路径的正确结果。如有任何帮助,我们将不胜感激。 我的2d阵列看起来像:X轴=城市1-20,y轴=城市1-20。 这是我到目前为止的代码: 对于城市1和2之间的最短路径,我的程序给出了总距离276。经历19、5、16、11 正确的解决方案是总距离225。路径应该19, 5,

  • 我确实有一个图(~250个节点)。要连接到一个节点,我必须用points->加权图购买它。有些节点总是被占用(“声明的节点”),我可以从这些节点开始连接到其他节点。此外,我的点数有限。所有节点都可以连接在一起。 有什么方法可以得到一个图,其中所有的节点都必须连接在一起,点最少?如果可能的话,以给定的最大点数。 第二)有没有一种方法可以使它不需要一个完全连通的图?例如:一个“必须有节点”的节点直接连

  • 在无向赋权图中寻找两个顶点之间的最短路径。还已知权重是小于log(logV)的整数,其中V是顶点的数量。使用贝尔曼-福特或Dijkstra算法很容易解决,但是有没有什么算法可以更快地解决呢? 到目前为止,我一直在考虑使用BFS,将权重大于1的边划分成两个权重为1的边,但如果V是大数,就不是一个好主意。不,这不是我的家庭作业,我只是在想。

  • 我想写一个算法,在有向图和无向图中找到两个特定顶点(源和目标)之间的最短路径。 我知道dijkstra算法,该算法用于寻找所有最短路径图。但是你会修改这个算法,只找到两个顶点之间的最短路径吗?