因此,如果我在一个图中有两个顶点,它们通过一个以上的边连接,而它们之间有相同的最短路径(即,如果我有节点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;
}
}
}
}
如果一个节点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路径距离。