图论:它会停止吗?

Posted

技术标签:

【中文标题】图论:它会停止吗?【英文标题】:Graph Theory : Will it stop or not? 【发布时间】:2017-08-14 04:55:19 【问题描述】:

我不知道如何从这个问题开始:

一个图有n个顶点和m条边。没有两对顶点可以通过一条以上的边连接起来。Rahul开始玩游戏: 他以下列方式改变边缘 -

他选择了一个顶点,并从该顶点向不存在边的所有其他顶点添加一条边。 同时,从该顶点删除所有预先存在的边。

只有当它们在每两个顶点之间存在直接边缘时,此游戏才会停止。您需要确定是否有可能完成这场比赛,或者这是否永远不会发生,无论他采取什么行动。

输入:将给出图形的初始状态。 输出:“是”或“否”

有人可以提示如何开始吗??

【问题讨论】:

我投票决定将此问题作为题外话结束,因为此问题不是编程问题,应该出现在 puzzles.SE 或 math.SE 上。 【参考方案1】:

1) 移动的顺序无关紧要(因为您可以将任何两个后续移动交换到相同的结果); 2) 相同顶点的两个后续变化效果为零; 3)您可以到达最终状态iff。你可以到那里改变任何顶点不超过一次; 4) 任意两个连通的顶点必须都改变或都不变,任意两个不完全连通的顶点中的一个应该改变。

在图中取一个连通分量。那里的顶点应该全部改变或全部保持不变。如果组件没有完全连接,完成游戏是不可能的。如果至少有三个连通分量,则不可能完成游戏。如果恰好有两个全连接组件,则其中一个中的所有顶点都应更改。

答案:当且仅当图已经完全连接或由两个完全连接的组件组成时,游戏才能完成。 (很容易看出,当图由两个完全连接的组件组成时,更改一个顶点有效地将其从一个组件移动到另一个组件。)

检查答案的算法:假设我们有许多顶点 n,然后是 (a,b) 形式的边列表,其中 ab 是来自 [ 1,n]。让vertices 是记录数组(num_edges, connected, sample),用(0,k,k) 初始化(k 是顶点编号)。然后对于每个边(A,B):

    将 A 和 B 的 num_edges 增加 1; 如果A.sample等于B.sample,则转到下一条边; 交换A.connectedB.connected,从A.connected开始顶点集sampleA.sample并跟随connected直到到达B;到了下一个边缘。

最后检查从1 开始和connected 之后的所有顶点是否具有相同的num_edges 等于(它们的数量 - 1)以及类似循环的所有剩余顶点。时间应该是O(max(n log(n), m)),内存O(n)。

【讨论】:

我无法理解算法。你能解释一下样品和连接到底是什么。 :) 本质上它跟踪连接的组件:每个连接的图组件都构成一个链接循环(connected 是指向下一个元素的指针),其中sample 具有相同的值(与其他组件不同:@ 987654343@ 是给定连接组件的“名称”)。您从每个顶点作为其自己的连接组件开始,每当新边连接两个不同的组件时,您将两个循环合并为一个循环并将sample 替换为(随机)初始循环之一,因此合并循环仍然具有相同的@987654345 @-“名称”。 该问题是一个数学问题,有一个 O(1) 解,可以求解 nm 的数值,与连接的顶点无关。 @MT0 考虑大小写 n=4, m=3 和两个图表:(1,2), (1,3), (2,3)(1,2), (2,3), (3,4)。两者都有相同的nm;在第一种情况下,我们通过切换顶点“4”来结束游戏,但在第二种情况下,无法完成(三个顶点之间的边数为偶数)。【参考方案2】:

具有 n 个顶点的已求解图将是具有 ½n(n-1) 的完整图 kn > 边缘。

翻转一个顶点的状态将意味着该顶点与图断开连接,并且有两个断开连接的完整子图K1K(n-1) 分别包含 0½(n-1)(n-2) 边。

翻转其他顶点的状态将使它们中的每一个与包含它的完整子图断开连接,并将其连接到另一个完整子图的所有顶点。所以,一般来说,如果有 x 个顶点处于翻转状态,那么就会有两个完整的子图 Kx K(nx) 分别具有 ½x(x-1)½(nx)(n-1-x) 边总共 m = ½n(n-1) - nx +x(x-1) 条边。

如果我们知道 mn,那么我们可以求解二次方程以找到解决问题所需的移动次数 x

x = ( n - SQRT( 4m + 2n - n² ) ) / 2

如果 x 是非整数,则该谜题不可解。

如果 x 是一个整数,那么这个谜题可能正好可以通过 x 步来解决,但是需要额外检查一下是否有两个不连贯的完整子图KxK(nx)

算法

计算x;如果它不是整数,则该图是不可解的。 [复杂性:O(1)] 选择一个随机顶点: 它的度数应该是(x-1)(n-x-1);如果不是,则该图不可解。 生成所有相邻顶点的列表。 [复杂性:O(n)] 从该顶点执行深度优先(或广度优先)搜索。 [复杂性:O(n+m)] 如果访问的边数是½x(x-1)½(nx)(n-1-x)(对应原始的度数vertex) 并且没有访问与原始不相邻的顶点,则子图是完整的,并且您知道该图是可解的;如果任一条件不成立,则该图不可解。 为了确定您可以对另一个子图执行相同的操作,但这是不必要的。

示例

n=4,m=2 与边 (1,2)(3,4) 的图是可解的,因为 x = ( 4 - SQRT( 0 ) ) / 2 = 2,一个整数,并且有两个K2 个断开的子图。

n=4,m=3 与边 (1,2)(2,3)(3,4) 的图有 x = ( 4 - SQRT( 4 ) ) / 2 = 1,一个整数,但有只有一个,连通的非完全图应该有两个不连通的K1K3子图表。

【讨论】:

以上是关于图论:它会停止吗?的主要内容,如果未能解决你的问题,请参考以下文章

当鼠标不再悬停在悬停动画上时,悬停动画会立即停止吗?

对话框中按键停止响铃

重新加载 supervisord 会导致其下的进程停止吗?

我需要 TThreads 吗?如果是这样,我可以暂停、恢复和停止它们吗?

我可以停止此重定向吗? formsubmit.co

我可以让 Visual Studio 停止任务代码中未处理的异常吗?