Graph 图的两个顶点之间的最短路径数
1) 有人知道无向无权图中最短路径的数目吗? 我想填充一个二维矩阵,它有任意I,j顶点的最短路径数, 2) 另一个问题是如何得到两个顶点i,j之间的最短路径数,路径必须经过某个顶点。 提前感谢。用于查找最短路径 NB如果您尝试使用Graph 图的两个顶点之间的最短路径数,graph,path,Graph,Path,1) 有人知道无向无权图中最短路径的数目吗? 我想填充一个二维矩阵,它有任意I,j顶点的最短路径数, 2) 另一个问题是如何得到两个顶点i,j之间的最短路径数,路径必须经过某个顶点。 提前感谢。用于查找最短路径 NB如果您尝试使用最短路径算法,谷歌会发现的第一件事是搜索…用于查找最短路径 NB如果你尝试使用最短路径算法进行搜索,谷歌会发现的第一件事是…迪克斯特拉是你的朋友。要找到包含特定节点的最短路径,请应用Dijkstra获得从a到B,然后从B到C的最短路径 要获得共享相同成本的路径数,应该很
最短路径算法,谷歌会发现的第一件事是搜索…用于查找最短路径
NB如果你尝试使用最短路径算法进行搜索,谷歌会发现的第一件事是…迪克斯特拉是你的朋友。要找到包含特定节点的最短路径,请应用Dijkstra获得从a到B,然后从B到C的最短路径
要获得共享相同成本的路径数,应该很容易修改Dijkstra,以便为您的家庭作业留下一些内容……:) 迪克斯特拉是你的朋友。要找到包含特定节点的最短路径,请应用Dijkstra获得从a到B,然后从B到C的最短路径
要获得共享相同成本的路径数,应该很容易修改Dijkstra,以便为您的家庭作业留下一些内容……:) 在这种情况下,您可以使用BFS。这是我几年前记忆中的一些人工智能课程的一个算法。我不能确保它工作完美,但希望它能给你一些提示
设X(p,d)
表示节点X
,其父节点为p
,与其父节点的距离为d
function findAllShortestPaths(...):
RET = set()
queue = [S(None, 0)]
explored = set()
while queue is not empty:
Node = queue.dequeue()
if Node is the one we're searching for:
if Node is not in RET:
RET.add(Node)
else:
if Node.d <= d of the node in RET:
RET.add(Node)
continue
if Node is not in explored:
explored.add(Node)
else:
if Node.d <= d of the node in explored:
explored.add(Node)
else:
continue
for Child in Node.childrens:
if Child is not in explored:
queue.append(Child(Node, Node.d + 1))
return RET, explored
最后,RET包含C(B,2),C(E,2),C(D,2)。从这里,结合探索列表,您可以追溯到源节点。例如,C(B,2)B(A,1)A(None,0)
可能有一些bug,但我认为这没什么大不了的。对于第二个问题,一旦我们解决了第一个问题,它就不太遥远了。希望能有帮助 在这种情况下,您可以使用BFS。这是我几年前记忆中的一些人工智能课程的一个算法。我不能确保它工作完美,但希望它能给你一些提示
设X(p,d)
表示节点X
,其父节点为p
,与其父节点的距离为d
function findAllShortestPaths(...):
RET = set()
queue = [S(None, 0)]
explored = set()
while queue is not empty:
Node = queue.dequeue()
if Node is the one we're searching for:
if Node is not in RET:
RET.add(Node)
else:
if Node.d <= d of the node in RET:
RET.add(Node)
continue
if Node is not in explored:
explored.add(Node)
else:
if Node.d <= d of the node in explored:
explored.add(Node)
else:
continue
for Child in Node.childrens:
if Child is not in explored:
queue.append(Child(Node, Node.d + 1))
return RET, explored
最后,RET包含C(B,2),C(E,2),C(D,2)。从这里,结合探索列表,您可以追溯到源节点。例如,C(B,2)B(A,1)A(None,0)
可能有一些bug,但我认为这没什么大不了的。对于第二个问题,一旦我们解决了第一个问题,它就不太遥远了。希望能有帮助 让admat作为图形的邻接矩阵。然后
admat给出顶点之间路径的长度为1
admat ^2给出了顶点之间路径的长度2
admat ^3给出了顶点之间的3条路径的长度
找到模式了吗?让admat作为图形的邻接矩阵。然后
admat给出顶点之间路径的长度为1
admat ^2给出了顶点之间路径的长度2
admat ^3给出了顶点之间的3条路径的长度
找到模式了吗?使用BFS,我们可以最小化复杂性
使用BFS和,我们必须在每层中保留一个额外的计数器let Sum(w)
让s为起始顶点,我们需要找到到v的最短路径的编号
然后设w是L(j-1)中的节点,v是L(j)中的节点
然后S(v)=求和{S(w)}+1
S(v)表示S和v之间的最短路径数。使用BFS,我们可以最小化复杂性
使用BFS和,我们必须在每层中保留一个额外的计数器let Sum(w)
让s为起始顶点,我们需要找到到v的最短路径的编号
然后设w是L(j-1)中的节点,v是L(j)中的节点
然后S(v)=求和{S(w)}+1
S(v)表示S和v之间最短路径的编号。在我上大学的时候,这是我的教授要我解决的问题。除非有人给出完整的答案,否则这不是作弊。但更像是旁观者解释解决家庭作业问题的方法。-1:如果有人在回答你的问题,仔细阅读答案、思考、尝试、提出相关问题是礼貌的,等等。即使人们添加了多个额外提示,你也会忽略它们……当然,我们朋友的问题是关于无方向的,所以我认为即使是dijkstra也不需要,你可以用bfs来处理,但有一件事我不知道,如果你使用bfs,你想如何区分以前的路径。有什么评论吗?当我在大学时,这就是我的教授要我解决的问题。除非有人给出完整的答案,否则这不是作弊。但更像是旁观者解释解决家庭作业问题的方法。-1:如果有人在回答你的问题,仔细阅读答案、思考、尝试、提出相关问题是礼貌的,等等。即使人们添加了多个额外提示,你也会忽略它们……当然,我们朋友的问题是关于无方向的,所以我认为即使是dijkstra也不需要,你可以用bfs来处理,但有一件事我不知道,如果你使用bfs,你想如何区分以前的路径。有什么评论吗?dijkstra找到了一条最短路径,这是可以的。但例如,2个顶点之间可能有3条最短路径,我只需要知道两个指定顶点之间的最短路径数。在算法执行期间,您可以跟踪一条路径与指向同一顶点的另一条路径的权重是否相同。dijkstra找到一条最短路径,这是可以的。但是在2个顶点之间可能有3条最短路径,我只需要知道两个指定顶点之间的最短路径的数量