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

时间:2010-01-12 23:12:55

标签: graph path

1)任何人都有想法获得无向未加权图中最短路径的数量? 我想填充一个二维矩阵,它具有任何i,j顶点的最短路径数, 2)另一个问题是如何以路径必须通过某个顶点的方式获得两个顶点i,j之间的最短路径数。 提前谢谢。

5 个答案:

答案 0 :(得分:2)

让admat成为图表的邻接矩阵。然后

admat给出顶点之间的长度为1的路径;

admat ^ 2给出顶点之间的长度为2的路径;

admat ^ 3给出顶点之间的3条路径;

发现模式了吗?

答案 1 :(得分:1)

Dijkstra http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm是你的朋友。要找到包含特定节点的最短路径,请应用Dijkstra以获得从A到B然后从B到C的最短路径。它是......

要获得共享相同成本的路径数量,应该很容易为此修改Dijkstra,以便为您的作业留下一些东西...... :)

答案 2 :(得分:1)

您可以在这种情况下使用BFS。这是一个算法,我刚刚记忆了几年前的一些AI课程。我不能确保它完美无瑕,但希望它会给你一些提示。

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

这是一个例子。假设您有一个5点(A,B,C,D,E)图,其线连接如下; AB,BC,CD,DA,EA,EB,EC,ED。您想要找到从A到C的所有最短路径。

X(parent, distance) ---> Y(...) Z(...)表示X被添加到被探索的集合中,Y和Z是X的子节点,它们被添加到队列中。

A(None, 0) ---> B(A, 1) E(A, 1) D(A, 1)
B(A, 1)    ---> E(B, 2) C(B, 2)
E(A, 1)    ---> C(E, 2) D(E, 2)
D(A, 1)    ---> C(D, 2)

[E(B, 2) already in the explored list and the distance is 2 > E(A, 1), continue.]

C(B, 2)    ---> Our GOAL, add to RET
C(E, 2)    ---> Our GOAL, C already in RET but distance is equal, add to RET

[D(E, 2) already in the explored list and the distance is 2 > D(A, 1), continue.]

C(D, 2)    ---> Our GOAL, C already in RET but distance is equal, add to RET

最后,RET包含C(B,2),C(E,2),C(D,2)。从这里开始,结合已探索的列表,您可以追溯到源节点。例如,C(B, 2) B(A, 1) A(None, 0)

可能存在一些错误,但我认为这不是什么大问题。对于第二个问题,一旦我们弄明白第一个问题,它就不会太遥远。希望它有所帮助!

答案 3 :(得分:0)

Dijkstra's algorithm用于查找最短路径。

NB 如果您尝试将其与shortest path algorithm搜索一起使用,Google会发现第一件事......

答案 4 :(得分:0)

使用BFS我们可以将复杂性降至最低。

使用BFS,我们必须在每一层中保留额外的计数器Sum(w)。

让s是起始顶点,我们需要找到v的最短路径。

然后让w为L(j-1)中的节点,v为L(j)。

然后S(v)=求和{S(w)} + 1;

和S(v)表示s和v之间的最短路径的数量。