标签: graph-theory

我在解决 Google 的 foobar 挑战时遇到了一些麻烦。我处于第 4 级,但我不明白我们是如何获得路径矩阵的

我不需要任何代码。只需向我解释一下问题(尤其是路径矩阵)。问题如下:

你和你获救的兔子囚犯需要逃离这个空间站倒塌的死亡陷阱——而且要快!不幸的是,有些兔子因长期监禁而变得虚弱,跑不了快。他们的朋友正在试图帮助他们,但如果你也参与进来,这次逃跑会更快。防御舱壁的门已经开始关闭,如果你不及时通过,你就会被困住!你需要抓住尽可能多的兔子,并在舱壁关闭之前穿过它们。

从起点移动到所有兔子和舱壁所需的时间将以整数方阵的形式给出。每行都会告诉您按顺序到达起点、第一只兔子、第二只兔子、……、最后一只兔子和舱壁所需的时间。行的顺序遵循相同的模式(开始、每个兔子、舱壁)。兔子可以跳进你的怀里,所以把它们捡起来是瞬间的,在舱壁密封的同时到达舱壁仍然可以让你成功逃脱,尽管是戏剧性的。(别担心,任何你没有捡到的兔子都可以和你一起逃走,因为它们不再需要携带你捡到的兔子。)如果你愿意,你可以重新访问不同的地点,并移动到舱壁并不意味着你必须立即离开——如果时间允许,你可以在舱壁之间来回走动去捡更多的兔子。

除了花时间在兔子之间旅行之外,一些路径还与空间站的安全检查站互动,并将时间倒回时钟。向时钟添加时间将延迟舱壁门的关闭,如果门已经关闭后时间回到 0 或正数,则会触发舱壁重新打开。因此,绕圈行走并不断获得时间是可能的:也就是说,每次经过一条路径,都会使用或增加相同的时间。

编写一个答案(times,time_limit)形式的函数来计算你可以捡起的兔子数量以及它们是哪些兔子,同时仍然可以在门永远关闭之前通过舱壁逃走。如果有多组相同大小的兔子,则按排序顺序返回囚犯 ID(作为索引)最低的兔子组。兔子按照囚犯 ID 排序,第一个兔子为 0。最多有 5 个兔子,time_limit 是一个非负整数,最多为 999。

例如,在以下情况

[
  [0, 2, 2, 2, -1],  # 0 = Start
  [9, 0, 2, 2, -1],  # 1 = Bunny 0
  [9, 3, 0, 2, -1],  # 2 = Bunny 1
  [9, 3, 2, 0, -1],  # 3 = Bunny 2
  [9, 3, 2, 2,  0],  # 4 = Bulkhead
]
Run Code Online (Sandbox Code Playgroud)

时间限制为 1,内部数组的 5 行分别指定起点、兔子 0、兔子 1、兔子 2 和舱壁门出口。你可以采取以下路径:

Start End Delta Time …
Run Code Online (Sandbox Code Playgroud)

algorithm graph-theory matrix data-structures

1
推荐指数
1
解决办法
2956
查看次数

从遍历中获取顶点或路径时,Tinkerpop 非常慢

我的 Java 应用程序中有一个图形遍历,在遍历完成后需要 300 毫秒以上才能填充路径对象。这很奇怪,因为它只发生在某些特定的遍历上,而其他遍历会立即填充它们的路径。这是 Java 代码示例,使用 Tinkerpop 3.3.1

我有一种情况,两个顶点由一条边直接连接。每次执行这个短遍历时,我都会得到很高的处理时间。如果我不执行 fill() 操作,遍历会立即完成。我还有其他需要遍历 10 多个边的遍历,并且它们在 < 1 毫秒内处理和填充路径。

在下面的代码中,我试图找到从“origs”中的顶点到“dests”中的顶点的最短路径,而不经过集合“avoids”中的任何顶点。遍历本身在 1 毫秒内完成,它的 fill() 方法消耗了时钟。

    Date startTime = new Date ();
    if (! dests.isEmpty ()){
        g.V (origs).where (is (P.without (avoids))).    
        repeat (
                out ().
                simplePath ().
                where (is (P.without (avoids)))
                ).
                until (is (P.within (dests))).
                limit (1).
                path ().
                fill (paths);  // This 'fill' is the line that can take > 300ms.
                               // When fill is removed from the code,
                               // this all …
Run Code Online (Sandbox Code Playgroud)

java graph-theory gremlin tinkerpop tinkerpop3

1
推荐指数
1
解决办法
366
查看次数

寻找通过顶点 u 和 v 的最小权重电路

我有一个无向且连通(不完整)的顶点图,其中uv可以是任意 2 个不同的顶点。我想构建从顶点u开始,经过v,然后返回到u 的最小权重电路,而不重复任何边。可以通过执行以下操作来完成吗?

  1. 找到从uv 的最短路径- 称之为p1

  2. 从图中删除p1的所有组成边

  3. 寻找从vu 的新最短路径- 称之为p2

  4. 将所有删除的边返回到图中,并将p1p2连接在一起 - 称之为c1

考虑到同时通过uv的约束,c1是可以构造的最小权重电路吗?如果是的话,我该如何证明,如果不是,为什么不呢?

这对我来说似乎很有意义,因为c1中包含的所有路径本身也是最短路径,但是我无法完全摆脱我可能会错过某些东西的感觉。

编辑:我已将“完全连接图”更改为“连接图”。“完全”意味着图表是完整的,这不是我的意思。

algorithm graph-theory graph-algorithm

1
推荐指数
1
解决办法
168
查看次数

连接具有公共点的线

我有一个这样的行列表:

Lines = ['1', '2', '3', '4', '5', '6', '7', '8']
Run Code Online (Sandbox Code Playgroud)

每条线有两个点 I 和 J:

LinesDetail = {
    '1': {
        'I': '100',
        'J': '101'},
    '2': {
        'I': '101',
        'J': '102'},
    '3': {
        'I': '256',
        'J': '257'},
    '4': {
        'I': '257',
        'J': '258'},
    '5': {
        'I': '258',
        'J': '259'},
    '6': {
        'I': '304',
        'J': '305'},
    '7': {
        'I': '305',
        'J': '306'},
    '8': {
        'I': '102',
        'J': '103'}}
Run Code Online (Sandbox Code Playgroud)

正如您在图片中看到的,其中一些线具有相互点,因此它们相互连接,我需要知道哪些线相互连接。

我尝试了 while 循环,但我不知道如何解决此类问题的基本概念。

线路

结果是:

result = [["1","2","8"],["3","4","5"],["6","7"]]
Run Code Online (Sandbox Code Playgroud)

所有线都是垂直的

python algorithm plot graph-theory while-loop

1
推荐指数
1
解决办法
111
查看次数

如何将组标识符组合成单个组?

我有一个数据集如下:

;WITH CTE AS
( SELECT *
  FROM (VALUES
(1, 10, 20, 30)
(2, 10, 21, 31)
(3, 11, 21, 31)
(4, 12, 22, 32)
(5, 13, 23, 33)
(6, 14, 24, 33)
(7, 14, 25, 34)
(8, 15, 26, 36)
) AS MyValues(ID, GroupID1, GroupID2, GroupID3)
)
SELECT *
FROM CTE
Run Code Online (Sandbox Code Playgroud)

如何生成以下内容,将各个组折叠成一个组?

ID 单组ID
1 1
2 1
3 1
4 2
5 3
6 3
7 3
8 4

sql sql-server graph-theory recursive-query

1
推荐指数
1
解决办法
129
查看次数

寻找相同的子图

鉴于:

  • 有向图
  • 节点有标签
  • 相同的标签可以出现不止一次
  • 边缘没有标签

我想找到一组最大(连通)子图,这些子图是相同的,考虑了节点的标签.

图表可能很大(数百万个节点)有人知道这个有效的解决方案吗?

我正在寻找算法,理想情况下是Java实现.

更新:因为这个问题很可能是NP完全的.我也会对产生近似解的算法感兴趣.

这似乎至少接近: 频繁的子图

algorithm graph-theory

0
推荐指数
1
解决办法
250
查看次数

计算图表中的路径

我必须创建一个方法来创建一个包含图形中所有路径的列表.我的图形只有一个起始节点和一个结束节点.每个节点都有一个列表,其子列表和其父节点列表.我必须制作另一个包含所有路径的列表(每个路径都在另一个列表中)

有什么建议??

algorithm graph-theory

0
推荐指数
1
解决办法
410
查看次数

算法对n*n距离矩阵提出质疑

假设我在n个用户之间有一个n*n的距离矩阵.我想知道使用什么算法来查找组周围的路由,从用户X开始并返回到用户X,所有其他节点访问一次但只有一次,并且在每一跳中使用尽可能短的距离.

algorithm graph-theory graph

0
推荐指数
1
解决办法
114
查看次数

确定是否可以仅使用2种颜色对无向图进行着色

有关如何确定无向图是否只用2种颜色着色的任何提示?怎么能在java中实现?

java graph-theory graph

0
推荐指数
1
解决办法
1376
查看次数

完整图形组件的数量

给出一个无向图.如何检查是否可以将其分为两组,其中一组中的每个节点都连接到其自身组的每个其他节点(完整图形).集合可以是空的,也可以只有一个节点.不应该留下任何节点.谢谢.

编辑:不禁止两组之间的边缘.

基本上我们必须检查图表是否可以分为两个派系

algorithm graph-theory

0
推荐指数
1
解决办法
516
查看次数