Questions tagged «graphs»

关于图的问题,通过边连接的节点的离散结构。流行的口味是具有边缘能力的树木和网络。


3
无向树中只有一个遍历的最长路径
有两种使用深度优先搜索的标准算法来查找无向树中的最长路径: 从随机顶点开始DFS 并找到离它最远的顶点;说是。vvvv′v′v' 现在从开始DFS,以找到离它最远的顶点。该路径是图中的最长路径。v′v′v' 问题是,这可以更有效地完成吗?我们可以用一个DFS或BFS做到吗? (这可以等效地描述为计算无向树的直径的问题。)

1
如果在BFS实现中将队列更改为堆栈,是否会获得DFS?
这是广度优先搜索的标准伪​​代码: { seen(x) is false for all x at this point } push(q, x0) seen(x0) := true while (!empty(q)) x := pop(q) visit(x) for each y reachable from x by one edge if not seen(y) push(q, y) seen(y) := true 此处push和pop被假定为队列操作。但是,如果它们是堆栈操作呢?生成的算法是否按深度优先顺序访问顶点? 如果您对“这很琐碎”的评论投了赞成票,请您解释一下为什么这很琐碎。我觉得这个问题很棘手。

3
算法,该算法找到的从简单的路径的数目到在
任何人都可以建议我一个线性时间算法,需要作为输入向无环图和两个顶点和,并返回从简单路径的数目到在。 我有一个算法,其中将运行DFS(深度优先搜索),但如果DFS找到则它将不会更改路径出现的任何节点的颜色(从白色到灰色),以便如果这是任何其他路径的子路径,那么DFS也会再次通过该子路径。例如,考虑邻接列表,我们需要在其中找到从p到v的路径数。G = (V,E)G=(V,E)G=(V,E)sssŤttsssŤttGGGŤtts⇝ts⇝ts \rightsquigarrow tv p o s z o r s v s r r y y v v w zpppvvv posryvzworryvwzsszvposzorsvsrryyvvwzwz\begin{array}{|c|c c c|} \hline p &o &s &z \\ \hline o &r &s &v\\ \hline s &r \\ \hline r &y \\ \hline y &v \\ \hline …

4
枚举一定大小的所有非同构图
我想枚举所有大小为无向图,但是我只需要每个同构类的一个实例。换句话说,我想枚举个顶点上的所有非同构(无向)图。我怎样才能做到这一点?nnnnnn 更准确地说,我想要一种算法,该算法将生成具有以下特性的无向图的序列:对于个顶点上的每个无向图,都存在一个索引,使得与同构。我希望该算法尽可能高效。换句话说,我关心的指标是生成和迭代此图列表的运行时间。第二个目标是,如果算法不太复杂而无法实现,那就太好了。G1,G2,…,GkG1,G2,…,GkG_1,G_2,\dots,G_kGGGnnniiiGGGGiGiG_i 请注意,每个同构类至少需要有一个图,但是如果该算法产生多个实例,则可以。特别是,如果输出序列包含两个同构图,则可以,只要这可以帮助您更轻松地找到这样的算法或启用更有效的算法,只要它覆盖所有可能的图即可。 我的应用程序如下:我有一个程序要在大小为所有图形上进行测试。我知道如果两个图是同构的,则我的程序将在两个同构上表现相同(对两个图都正确,或者对两个图都不正确),因此足以枚举每个同构类的至少一个代表,然后对其进行测试。对这些输入进行编程。在我的应用程序中,很小。nnnnnn 我考虑过一些候选算法: 我可以列举所有可能的邻接矩阵,即所有对称的 0或1矩阵,对角线都为0。但是,这需要枚举矩阵。这些矩阵中有许多将表示同构图,因此这似乎在浪费大量精力。n×nn×nn\times n2n(n−1)/22n(n−1)/22^{n(n-1)/2} 我可以列举所有可能的邻接矩阵,并针对每个矩阵测试它与我先前输出的任何图是否同构;如果它与之前输出的内容不是同构的,则将其输出。这将大大缩短输出列表,但是仍然需要至少个计算步骤(即使我们假设图形同构检查是超快的),因此通过我的指标。2n(n−1)/22n(n−1)/22^{n(n-1)/2} 可以枚举邻接矩阵的子集。特别是,如果是个顶点,则可以不失一般性地假设顶点的排列方式为。换句话说,每个图都是同构的,其中顶点以非降序排列。因此,仅枚举具有此属性的邻接矩阵就足够了。我不知道这样的邻接到底有多少矩阵也有,但它是许多不到他们可以用比少很多被列举GGGnnnV={v1,…,vn}V={v1,…,vn}V=\{v_1,\dots,v_n\}degv1≤degv2≤⋯≤degvndeg⁡v1≤deg⁡v2≤⋯≤deg⁡vn\deg v_1 \le \deg v_2 \le \cdots \le \deg v_n2n(n−1)/22n(n−1)/22^{n(n-1)/2}2n(n−1)/22n(n−1)/22^{n(n-1)/2}计算步骤。但是,这仍然留下了很多冗余:许多同构类仍然会被覆盖很多次,因此我怀疑这是最优的。 我们可以做得更好吗?如果我理解正确,大约是非同构图的等价类。我们能否找到一种运行时间比上述算法更好的算法?我们可以接近下界?我主要关心小(例如或左右;足够小以至于可以合理地运行这样的算法来完成),而不是大的渐近性。2n(n−1)/2/n!2n(n−1)/2/n!2^{n(n-1)/2}/n!∼2n(n−1)/2/n!∼2n(n−1)/2/n!\sim 2^{n(n-1)/2}/n!nnnn=5n=5n=5n=8n=8n=8nnn 相关:构建不等价的二元矩阵(尽管不幸的是,似乎没有收到有效的答案)。

2
在哪里获取图表来测试我的搜索算法?
我正在实现一组路径查找算法,例如Dijkstra的,Depth First等。 最初,我使用了两个自制的图表,但现在我想进一步挑战一下,因此我正在寻找 基准测试中使用的图表; 现实世界中的城市图表(或从Google地图上下载此类信息的方法,或者其他任何可能的来源)。 我希望这些资源具有或允许我轻松创建边界,以便在可能的情况下尝试针对不同大小的图形集进行算法。 我正在寻找简单的解决方案,因为我不希望偏离主要目标(比较一组不同的算法),所以我需要一种快速的方法来将图形数据转换为自己的格式(基本上是连接(x, y)点集)。 更具体地说,我正在寻找的是2D循环图。如果这些图反映了现实世界中的城市街道(考虑单向街道,两向街道等,那就更好了!)。

2
如何有效地确定给定的梯子是否有效?
在我当地的壁球俱乐部,有一个梯子的工作原理如下。 在本赛季开始时,我们会在单独的一行中构建一个表,其中包含俱乐部的每个成员的姓名。 然后,我们在每个名字旁边写上获胜游戏数和玩游戏数(格式:玩家获胜/游戏)。 因此,在本赛季开始时,表格如下所示: Carol 0/0 Billy 0/0 Alice 0/0 Daffyd 0/0 任何两名玩家均可参加比赛,其中一名玩家获胜。如果最接近桌面底部的玩家获胜,则将切换玩家的位置。然后,我们重复步骤2,更新每个玩家旁边的获胜次数和比赛数。例如,如果爱丽丝击败比利,我们有 Carol 0/0 Alice 1/1 Billy 0/1 Daffyd 0/0 这些比赛在整个赛季中持续进行,最终导致球员按实力顺序排列。 不幸的是,更新是以相当偶然的方式发生的,因此会出错。以下是无效表格的一些示例,也就是说,对于某些开始顺序(我们忘记了本赛季开始时使用的顺序)以及比赛和结果的顺序,无法正确按照上述步骤操作而无法生成的表格: Alice 0/1 Billy 1/1 Carol 0/1 Daffyd 0/0 Alice 2/3 Billy 0/1 Carol 0/0 Daffyd 0/0 Alice 1/1 Billy 0/2 Carol 2/2 Daffyd 0/1 给定一个表,我们如何有效地确定它是否有效?我们可以从以下几点开始: 名称的顺序无关紧要,因为我们忘记了原始的起始顺序。 获胜总数应为比赛总数的一半。(这表明上面的第一个示例无效。) …

2
为什么C的void类型不同于Empty / Bottom类型?
维基百科以及我发现的其他来源都将C的void类型列为单位类型,而不是空类型。我觉得这很混乱,因为在我看来,它void更适合于空/底类型的定义。 void据我所知,没有价值观存在。 返回类型为void的函数指定该函数不返回任何内容,因此只能执行某些副作用。 类型的指针void*是所有其他指针类型的子类型。同样,void*在C中进行来回转换是隐式的。 我不确定最后一点是否可以作为void空类型的参数,void*或多或少是与无关的特例void。 另一方面,void它本身不是所有其他类型的子类型,据我所知,这是将类型作为底部类型的要求。
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

4
如何在线性时间内找到超级巨星?
考虑有向图。当且仅当无法从该节点到达其他节点,但所有其他节点都具有的边缘时,我们才称该节点为超级星。正式地:vvvv vvv \qquad \displaystyle v 巨星 :⟺ ö ù 吨d ë 克(v )= 0 ∧ 我Ñ d ë 克(v )= ñ - 1 superstar :⟺outdeg(v)=0∧indeg(v)=n−1 \text{ superstar } :\Longleftrightarrow \mathrm{outdeg}(v) = 0 \land \mathrm{indeg}(v) = n-1 其中ñnn为图中的节点数。例如,在下图中,未填充的节点是超级明星(其他节点不是)。 [ 来源 ] 您如何在O (n )O(n)\mathcal{O}(n)时间中识别有向图中的所有超级明星?可以从通常的候选项中选择合适的图形表示形式;请不要使用将问题的复杂性转移到预处理的表示形式。 无法做出有关密度的假设。我们不认为图表包含超级巨星;如果没有,则算法应识别出它。 符号:Ò ù 吨d È 克outdeg\mathrm{outdeg}是一个节点的传出边缘的数目,我Ñ d …

7
使用BFS / DFS查找树的直径的算法。为什么行得通?
该链接提供了一种使用BFS / DFS查找无向树的直径的算法。总结: 在图中的任何节点上运行BFS,记住您最后发现的节点。记住最后发现的节点v,从u运行BFS。d(u,v)是树的直径。 为什么行得通? 第2页,这提供了一个理由,但它是混淆。我引用了证明的初始部分: 在图中的任何节点上运行BFS,记住您最后发现的节点。记住最后发现的节点v,从u运行BFS。d(u,v)是树的直径。 正确性:令a和b为任意两个节点,使得d(a,b)是树的直径。从a到b有一条独特的路径。令t为BFS在该路径上发现的第一个节点。如果从s到u 的路径p1p1p_1和从a到b的p2p2p_2路径不共享边,则从t到u的路径包括s。所以 d(t,u)≥d(s,u)d(t,u)≥d(s,u)d(t,u) \ge d(s,u) d(t,u)≥d(s,a)d(t,u)≥d(s,a)d(t,u) \ge d(s,a) ....(更多不平等现象随之而来。) 不平等对我来说没有意义。



3
检索动态图的最短路径
我目前正在研究有向图中的最短路径。有许多有效的算法可用于查找网络中的最短路径,例如dijkstra算法或bellman-ford算法。但是,如果图形是动态的,该怎么办?我说动态是指我们可以在程序执行期间插入或删除顶点。我正在尝试找到一种有效的算法,用于在插入边e之后更新从顶点到每个其他顶点u的最短路径,而无需在新图中再次运行最短路径算法。我怎样才能做到这一点?提前致谢。vvvüuuËee 注意:更改可以在算法的第一次迭代后完成 注[2]:两个节点中给出,源和Ť目标。我需要找到这些节点之间的最短路径。当图形更新时,我只需要更新π (s ,t ),这是s和t之间的最短路径。sssŤttπ(s ,t )π(s,t)\pi(s,t)sssŤtt 注意[3]:我只对边缘插入盒感兴趣。 正式定义:给定一个图。定义一个更新操作作为1)的边缘的插入ë到ë或2)的边缘的氨基酸缺失ë从ë。目的是有效地找到更新操作后所有对最短路径的成本。有效地,我们的意思至少比每次更新操作后执行All-Pairs-Shortest-Path算法(例如Bellman-Ford算法)更好。G = (V,E)G=(V,E)G = (V,E)ËeeËEEËeeËEE 编辑:下面是问题的简化版本: 给出了一个加权图,该图由单向边以及两个关键顶点s和t组成。还给出了候选双向边缘的集合C。我必须建立一个边缘(Û ,v )∈ Ç以最小化从距离小号到吨。ģ (V,E)G(V,E)G(V,E)sssŤttCCC(Û ,v )∈ Ç(u,v)∈C(u,v) \in CsssŤtt

2
生成树问题的NP完整性证明
我正在寻找老师提出的问题中的一些提示。 所以我才发现这个决策问题是:Ñ P - C ^ ö 米p 升ë 吨ëNP-complete\sf{NP\text{-}complete} 在图,是否有在生成树包含确切组作为叶子。我发现我们可以通过减少汉密尔顿路径到这个决策问题来证明它是。G S = { x 1,x 2,… ,x n } N P - c o m p l e t eGGGGGG小号= { x1个,X2,… ,xñ}S={x1,x2,…,xn}S=\{x_1, x_2,\ldots, x_n\}Ñ P - C ^ ö 米p 升ë 吨ëNP-complete\sf{NP\text{-}complete} 但是我的老师也在课堂上问我们: 将它也是,如果不是“精确一套 ”,我们做小号Ñ P - C …

3
图的最小生成树何时不唯一
给定一个加权的无向图G:哪些条件必须成立,以便G 有多个最小生成树? 我知道,当所有权重都不同时,MST是唯一的,但是您不能撤销此声明。如果图中有多个权重相同的多重边,则可能有多个MST,但也可能只有一个: 在此示例中,左侧的图具有唯一的MST,而右侧的图则没有。 我最能找到MST非唯一性的条件是: 考虑图G中的所有无弦循环(不包含其他循环的循环)。如果在这些循环中的任何一个中最大加权边存在多次,则该图将没有唯一的最小生成树。 我的想法是像这样一个周期 使用n个顶点,您可以精确地忽略其中一条边,但仍将所有顶点连接在一起。因此,您有多种选择来删除具有最大权重的边缘以获得MST,因此MST不是唯一的。 但是,然后我想到了这个示例: 您可以看到此图的确有一个符合我的条件的循环:(E,F,G,H),但据我所知,最小生成树是唯一的: 因此,看来我的情况不正确(或者可能不完全正确)。我非常感谢为最小生成树的非唯一性找到必要和充分条件的任何帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.