Graph 图的两个顶点之间的最短路径数

Graph 图的两个顶点之间的最短路径数,graph,path,Graph,Path,1) 有人知道无向无权图中最短路径的数目吗? 我想填充一个二维矩阵,它有任意I,j顶点的最短路径数, 2) 另一个问题是如何得到两个顶点i,j之间的最短路径数,路径必须经过某个顶点。 提前感谢。用于查找最短路径 NB如果您尝试使用最短路径算法,谷歌会发现的第一件事是搜索…用于查找最短路径 NB如果你尝试使用最短路径算法进行搜索,谷歌会发现的第一件事是…迪克斯特拉是你的朋友。要找到包含特定节点的最短路径,请应用Dijkstra获得从a到B,然后从B到C的最短路径 要获得共享相同成本的路径数,应该很

1) 有人知道无向无权图中最短路径的数目吗? 我想填充一个二维矩阵,它有任意I,j顶点的最短路径数, 2) 另一个问题是如何得到两个顶点i,j之间的最短路径数,路径必须经过某个顶点。 提前感谢。

用于查找最短路径

NB如果您尝试使用
最短路径算法,谷歌会发现的第一件事是搜索…

用于查找最短路径

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条最短路径,我只需要知道两个指定顶点之间的最短路径的数量