Algorithm 图论:它会停止吗?
我不知道如何从这个问题开始: 一个图有n个顶点和m条边。没有两对顶点可以通过多条边连接。Rahul开始玩游戏: 他按照下面的方式改变边缘-Algorithm 图论:它会停止吗?,algorithm,graph-theory,graph-algorithm,Algorithm,Graph Theory,Graph Algorithm,我不知道如何从这个问题开始: 一个图有n个顶点和m条边。没有两对顶点可以通过多条边连接。Rahul开始玩游戏: 他按照下面的方式改变边缘- 他选择一个顶点,并从该顶点向不存在边的所有其他顶点添加一条边 同时,从该顶点删除所有预先存在的边 只有当两个顶点之间存在一条直边时,此游戏才会停止。你需要确定是否有可能完成这场比赛,或者无论他采取什么行动,这是否永远不会发生 输入:将给出图形的初始状态。 输出:“是”或“否” 有人能给你一个如何开始的提示吗?1)移动的顺序并不重要(因为你可以将任何两个后
- 他选择一个顶点,并从该顶点向不存在边的所有其他顶点添加一条边李>
- 同时,从该顶点删除所有预先存在的边
2) 具有相同顶点的两个后续更改的效果为零
3) 你可以到达最后的状态。你可以在那里改变任何顶点不超过一次
4) 任何两个连接的顶点必须同时更改或同时保持不变,在任何两个未连接的顶点中,只有一个应更改 在图中取一个连接的组件。其中的顶点应全部更改或保持不变。如果组件未完全连接,则无法完成游戏。如果至少有三个相连的组件,完成游戏是不可能的。如果有两个完全连接的组件,则应更改其中一个组件中的所有顶点 回答:当且仅当图形已经完全连接或由两个完全连接的组件组成时,游戏才能结束。(很容易看出,当图形由两个完全连接的组件组成时,更改顶点可以有效地将其从一个组件移动到另一个组件。) 检查答案的算法:假设我们得到一个顶点数n,然后是一个边列表,形式为
(a,b)
,其中a
和b
是[1,n]中的顶点数。设顶点
为记录数组(num_边,连接,示例)
,用(0,k,k)
初始化(k
为顶点编号)。然后,对于每个边(A,B):
num_边增加1
李>
如果A.sample
等于B.sample
,则转到下一条边李>
交换A.connected
和B.connected
,从A.connected
顶点集sample
到A.sample
,然后按照connected
一直到B;到了下一个边缘李>
最后,检查从1
开始的所有顶点以及连接的之后的所有顶点是否具有相同的num_边
等于(它们的编号为-1),以及类似循环的所有剩余顶点。时间应该是O(max(n log(n),m)),内存是O(n)。1)移动的顺序无关紧要(因为您可以将任何两个后续移动交换到相同的结果)
2) 具有相同顶点的两个后续更改的效果为零
3) 你可以到达最后的状态。你可以在那里改变任何顶点不超过一次
4) 任何两个连接的顶点必须同时更改或同时保持不变,在任何两个未连接的顶点中,只有一个应更改
在图中取一个连接的组件。其中的顶点应全部更改或保持不变。如果组件未完全连接,则无法完成游戏。如果至少有三个相连的组件,完成游戏是不可能的。如果有两个完全连接的组件,则应更改其中一个组件中的所有顶点
回答:当且仅当图形已经完全连接或由两个完全连接的组件组成时,游戏才能结束。(很容易看出,当图形由两个完全连接的组件组成时,更改顶点可以有效地将其从一个组件移动到另一个组件。)
检查答案的算法:假设我们得到一个顶点数n,然后是一个边列表,形式为(a,b)
,其中a
和b
是[1,n]中的顶点数。设顶点
为记录数组(num_边,连接,示例)
,用(0,k,k)
初始化(k
为顶点编号)。然后,对于每个边(A,B):
将A和B的num_边增加1
李>
如果A.sample
等于B.sample
,则转到下一条边李>
交换A.connected
和B.connected
,从A.connected
顶点集sample
到A.sample
,然后按照connected
一直到B;到了下一个边缘李>
最后,检查从1
开始的所有顶点以及连接的之后的所有顶点是否具有相同的num_边
等于(它们的编号为-1),以及类似循环的所有剩余顶点。时间应为O(max(n log(n),m)),内存为O(n)。具有n顶点的已求解图将是具有½n(n-1)边的完整图
翻转顶点的状态将意味着顶点与图断开连接,并且有两个断开连接的完整子图K1和K(n-1),它们分别包含0和½(n-1)(n-2)边
翻转其他顶点的状态将断开每个顶点与包含它的完整子图的连接,并将其连接到其他完整子图的所有顶点。因此,一般来说,如果存在翻转状态的x顶点,则将有两个完整的子图Kx和K(n-x),其中½x(x-1)
x = ( n - SQRT( 4m + 2n - n² ) ) / 2