1
6
见 http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm 一站式解决所有与图形相关的问题。我相信你的问题实际上是可以用二次时间来解决的。 |
2
31
您的描述似乎表明您只关心两个节点是否连接,而不是查找最短路径。 查找两个节点是否连接相对容易:
如果您对todoset和doneset使用哈希表或类似的方法,我相信这是一种线性算法。 请注意,此算法基本上是标记和扫描垃圾收集的标记部分。 |
3
5
对于这个问题,您不需要Dijkstra的算法,因为它使用了一个不需要的堆,并为您的复杂性引入了一个对数因子(n)。这只是宽度优先搜索——不要将闭合边作为边。 |
4
3
寻找最短路径的问题不是NP完全问题。这就是所谓的最短路径问题 algorithms 解决许多不同的变化。 确定两个节点是否连接的问题也不是NP完全问题。可以使用从任一节点开始的深度优先搜索来确定它是否连接到另一个节点。 |
5
2
非NP完全,用已知解求解- Dijkstra's Algorithm |
6
2
对我来说,你似乎正在寻求解决办法,但我可能误解了这个问题。如果你按照你说的做,并且把闭合边1作为权重,你只需要应用Dijkstra的算法, http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm . 这可以解决你在O(e*lg(v))中的问题。 |
7
2
假设你有一个邻接矩阵:
其中bool[i,j]=真,如果在i和j之间有一条开放的路径,bool[i,i]=假。
下面是上面的算法的递归版本(用Ruby编写):
|
8
1
如果您只需要确定是否连接了两个节点,那么您可以使用集合,这比图形算法更快。
首先,您的节点将是其集合中的每个节点,
随着算法的发展和集合的合并,输入相对减半。 在上面的例子中,我想看看O1和O2之间是否存在路径。我在合并所有边之后才找到这条路径。有些图可能有单独的组件(断开连接),这意味着您将无法在末尾设置一组。在这种情况下,您可以使用这个算法来测试连通性,甚至计算图中组件的数量。组件数量是当算法完成时可以得到的集合数。 一个可能的图(对于上面的树):
|
9
0
Dijkstra太过分了!! 只需使用宽度优先搜索来搜索要到达的节点。如果你找不到它,它就没有连接。每个搜索的复杂性是O(nm),比dijkstra要小。 有点相关的是最大流量/最小切割问题。查一下,可能和你的问题有关。 |
10
0
我知道你的答案是肯定不是NP完全,这也是一个很古老的问题。 不过,我将提出另一种方法来研究这个问题。你可以使用不相交的集合。在大多数情况下,对于给定的场景,该方法将比执行图形遍历(包括 固定时间 对于大量的测试)。但是,如果使用按列联合或按路径压缩,则构建图表可能需要很长的时间。 您可以阅读有关数据结构的信息 here . |
11
-1
如果你只需要找出一个节点是否连接到另一个节点上,那么任何图最短路径算法都将是多余的。一个很好的Java库 JGraphT . 它的用法非常简单,下面是一个整数图的示例:
这个lib还提供所有最短路径算法。 |
quantummidget · 正在查找BFS父关系数组 6 年前 |
I'm not human · Prolog查找不相关的图形节点 6 年前 |
WIZARD_ · 无向非加权图的最大顶点对数 6 年前 |
user9137770 · 邻接列表与邻接矩阵的区别 7 年前 |
Sook Yee Lim · 在给定邻接矩阵的情况下求两个图的交并? 7 年前 |
DK100 · 在广度优先搜索中处理重复节点 7 年前 |
Keith Pham · 最大化给定预算的子图“价值” 7 年前 |
Mathochist · 在配对列表中查找最大配对数 7 年前 |