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

如何计算2个顶点之间的所有最短路径?

牧献
2023-03-14

因此,如果我在一个图中有两个顶点,它们通过一个以上的边连接,而它们之间有相同的最短路径(即,如果我有节点a和节点B,它们直接通过三条边连接(它们之间有三条最短路径,每个距离为1),所以计数应该返回3)我该如何修改BFS算法来实现这一点?这是我的代码,它只计算2个节点之间的最短路径,而不计算这些最短路径的个数。

public void BFSDegree(Graph g, string s, string p)
    {
        Queue<string> q = new Queue<string>();
        dist.Add(s, 0);       
        q.Enqueue(s);

        while (q.Count() != 0)
        {
            string j = q.Dequeue();
            foreach (string h in g.adjacentTo(j))
            {
                if (!dist.ContainsKey(h))
                {
                    q.Enqueue(h);
                    dist.Add(h, 1 + dist[j]);
                }

                if (j == p)
                {
                    Console.WriteLine("               " + dist[j]);
                    return;
                }
            }
        }
    }

共有1个答案

艾俊晖
2023-03-14

如果一个节点u有x条最短路径,那么通过它发现的一个相邻节点v将有x乘以y条最短路径,其中y是从u到v的边数。此外,如果v可以通过其他相邻节点(具有相同路径长度)到达,那么它的最短路径数将是为每个父节点计算的所有xy因子的和。

因此,算法将与您的原型截然不同。我建议使用一个主循环,它在每次迭代中增加当前长度,然后通过查看队列中节点的所有未访问的相邻节点来处理队列,计算每个相邻节点的xy因子之和,然后清除队列并为下一次迭代查询所有相邻节点(并将它们标记为已访问)。在第一次迭代中,路径长度为0,队列只包含源节点。

public void BFSDegree(Graph g, string s, string p)
{
    Queue<string> q = new Queue<string>();
    HashMap<string, int> path_counts = new HashMap<string, int>();
    path_counts.put(s, 1);       
    q.Enqueue(s);

    while (q.size()>0)
    {
        HashMap<string, int> adj_nodes = new HashMap<string, int>();
        foreach (string j in q) 
        {
            foreach (string h in g.adjacentTo(j))
            {
                if (!path_counts.ContainsKey(h))
                {
                    int count = 0;
                    if (adj_nodes.containsKey(h))
                        count=adj_nodes.get(h);
                    count += path_counts.get(j);
                    adj_nodes.put(h, count);
                }
            }
        }
        if (adj_nodes.containsKey(p))
        {
            Console.WriteLine("               " + adj_nodes.get(p));
            return;
        }
        path_counts.putAll(adj_nodes);
        q.clear();
        q.addAll(adj_nodes.keySet());
    }
}
 类似资料:
  • 下面的堆栈溢出问题 我尝试了在语句中使用两个重复的多个构造,但无法为每个起始顶点获得独立的。我也在使用平台,因此它限制了Gremlin的使用,其中不允许使用循环/脚本。所有gremlin查询必须以并由与链接在一起的命令组成 https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.ht

  • 我试图弄清楚,如何计算具有加权顶点的图的最短路径。经典算法,如Dijkstra和Floyd-WarMarshall,通常使用加权边,我看不到如何将它们应用于我的情况(加权顶点): 我的一个想法是将图形转换为带有加权边的更经典的视图。这是我收到的: 这里我们有单向和双向加权边,但我仍然不确定哪种算法可以处理这一点,以找到最短路径。

  • 我正在尝试编写一个算法,该算法将重建Floyd-Warshall算法中所有顶点对之间的最短路径(如果有,则为最短路径绑定多条路径)。我从这个问题中得到了一些提示:https://stackoverflow.com/a/11371588/7447425 基于此,我修改了Floyd Warshall算法: 该图是边缘列表的形式,例如: 到目前为止,一切似乎都很顺利。 对于路径重建, 但这不管用。那么,

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

  • 以下是练习: null null 我的算法正确吗?如果我做v到w,然后做w到v,这仍然被认为是线性时间吗?

  • 我们有一个边带正权的有向图G(V,E),作为源顶点s,目标点T。此外,最短的s-t路径包括图中的每一个其他顶点。我需要计算s和t之间的交替最短路径距离,以防某些边e∈e被删除。我想设计一个O(e^2logV)算法,它计算图G\e中所有e∈e的最短S-T路径距离。最后的输出应该是一个大小为E的数组,其中edge E的条目应该包含G\E中最短的S-T路径距离。