图论:它会停止吗?

时间:2017-03-22 07:42:38

标签: algorithm graph-theory graph-algorithm

我无法了解如何从这个问题开始:

图形有n个顶点和m个边。没有两个顶点可以通过多个边连接.Rahul开始玩游戏: 他以下列方式改变边缘 -

  • 他选择一个顶点,并将该顶点的边添加到边不存在的所有其他顶点。
  • 同时删除该顶点的所有预先存在的边。

只有在每两个顶点之间存在直接边缘时,此游戏才会停止。你需要确定是否有可能完成这个游戏,或者无论他做出什么动作,这是否永远不会发生。

输入:将给出图的初始状态。 输出:"是"或"不"

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

2 个答案:

答案 0 :(得分:2)

1)移动顺序无关紧要(因为你可以将任意两个后续移动换成相同的结果); 2)具有相同顶点的两个后续变化具有零效果;
3)你可以进入最终状态iff。你可以在那里改变任何顶点不超过一次;
4)任何两个连接的顶点必须都被改变或两者都没有改变,任何两个未连接的顶点都应该被改变。

在图表中选择已连接的组件。那里的顶点应该全部改变或全部保持不变。如果组件未完全连接,则无法完成游戏。如果至少有三个连接组件,则无法完成游戏。如果恰好有两个完全连接的组件,则应更改其中一个组件中的所有顶点。

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

检查答案的算法:假设我们获得了多个顶点n,然后是(a,b)形式的a和{{1}格式的边列表是来自[1,n]的顶点数。让b成为记录数组vertices,使用(num_edges, connected, sample)初始化((0,k,k)是顶点数)。然后为每个边缘(A,B):

  1. k;
  2. 为A和B增加num_edges
  3. 如果1等于A.sample,请转到下一个边缘;
  4. 交换B.sampleA.connected,从B.connected顶点集A.connected开始到sample,然后关注A.sample直到达到B;到了下一个边缘。
  5. 最后检查从connected1开始的所有顶点是否具有相同的connected(它们的数字-1)以及类似循环的所有剩余顶点。时间应为O(max(n log(n),m)),存储器O(n)。

答案 1 :(得分:1)

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

翻转顶点的状态意味着顶点与图形断开连接,并且有两个断开的完整子图 K 1 K < sub>(n-1) ,分别包含 0 ½(n-1)(n-2)边。< / p>

翻转其他顶点的状态将使每个顶点与包含它的完整子图断开连接,并将其连接到另一个完整子图的所有顶点。所以,通常情况下,如果 x 顶点有翻转状态,那么将会有两个完整的子图 K x K (nx) 分别带有½x(x-1)½(nx)(n-1-x)边总共 m =½n(n-1) - nx + x(x-1)边缘。

如果我们知道 m n 那么我们可以求解二次方程来找出解决问题所需的移动次数 x

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

如果 x 是非整数,则拼图无法解决。

如果 x 是一个整数,那么拼图可以在 x 移动中解决,但需要进行额外的检查以查看是否存在两个断开连接的完整子图 K x K (nx)

<强>算法

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

<强>实施例

由于 x =(4 - SQRT(0))/ 2 = 2 ,因此n=4,m=2带边(1,2)(3,4)的图表是可解的整数,并且有两个 K 2 断开连接的子图。

带边n=4,m=3(1,2)(2,3)的{​​{1}} x =(4 - SQRT(4))/ 2 = 1 ,一个整数,但只有一个连接的非完整图,当应该有两个断开的 K 1 K 3 子图。