我无法了解如何从这个问题开始:
图形有n个顶点和m个边。没有两个顶点可以通过多个边连接.Rahul开始玩游戏: 他以下列方式改变边缘 -
只有在每两个顶点之间存在直接边缘时,此游戏才会停止。你需要确定是否有可能完成这个游戏,或者无论他做出什么动作,这是否永远不会发生。
输入:将给出图的初始状态。 输出:"是"或"不"
有人可以提示如何开始吗?
答案 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):
k
; num_edges
1
等于A.sample
,请转到下一个边缘; B.sample
和A.connected
,从B.connected
顶点集A.connected
开始到sample
,然后关注A.sample
直到达到B;到了下一个边缘。 最后检查从connected
和1
开始的所有顶点是否具有相同的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 =(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 子图。