[英]How to create adjacency list from list of edges
我们想编写一个函数来将给定工作流的步骤分成多个阶段,这样每个阶段中的所有步骤都可以同时运行。 该函数应该返回一个列表列表,其中每个列表代表一个阶段。 每个步骤都应在尽可能早的阶段运行。
precursor_steps = [
["clean", "build"],
["metadata", "binary"],
["build", "link"],
["link", "binary"],
["clean", "metadata"],
["build", "resources"]
]
[
["clean"],
["build", "metadata"],
["resources", "link"],
["binary"]
]
我正在尝试为上图创建邻接列表,但我是 Python 新手,我无法做到。
当边缘是整数时,我的下面的代码工作正常,但我不能将它用于字符串边缘
precursor_steps = [["clean", "build"],["metadata", "binary"],["build", "link"],["link", "binary"],["clean", "metadata"],
["build", "resources"]]
#precursor_steps=[[0,1],[1,2],[2,1]]
def rungraph(nums):
v = 0
counter = set()
for src, dest in nums:
counter.add(src)
counter.add(dest)
#print counter
v = len(counter)
adj = {s:[] for s in range(v)}
for p1, p2 in nums:
print "p1",p1,"p2",p2
adj[p1] += [p2]
print "mtx=>",adj
rungraph(precursor_steps)
欢迎任何建议。
问题在于您的adj
声明。 您希望此字典将每个顶点映射到它相邻的顶点列表。 但是你用数字作为键来初始化adj
(所以当你的输入图有n
个顶点时,你正在初始化adj
以将数字0
到n-1
作为键,每个数字都映射到空列表)。 当您的顶点也是数字时,这会起作用,如您注释掉的示例所示。 但是当你的节点是字符串时它会失败,因为然后字典用数字初始化,所以用语句adj[p1] += [p2]
更新值失败,因为字符串p1
不作为字典中的键存在。
要解决此问题,请将adj
的初始化更改为:
adj = {s: [] for s in counter}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.