这篇文章,我想分享一下自己的经验,关于如何快速找到起点。
APK下载链接:javascript:void(0)
规则介绍:
这个游戏是要一笔画完整个图,由于起点为给出,所以需要自己寻找。
如果一开始起点就选错了,那么无论如何都无法过关了。
这个游戏,是难度递增的,可以分成四大类。
第一种,是只有蓝线的(有的上面还有箭头),也就是简单图。
第二种,有了红线(有的上面还有箭头),红线其实就是二重平行边。
第三种,有了传送门,传送门是2个黄点组成的一对。(图中只有1个传送门,也只有2个黄点)
第四种,有了绿线,绿线都是带箭头的,而且其中一端是绿点。每次经过绿点,绿线的方向就会改变。
下面分这四种类型,分别介绍如何寻找起点。
一,简单图
简单图有2种,一种是没有奇点的:
无论是有向图还是无向图,一定是一个闭环,那么任何点都可以用作起点。
另外一种是有2个奇点的:
2个奇点必定是起点和终点。
在无向图中,任意一个做起点,另外一个做终点,都可以。
在有向图中,有的像图12一样,2个点都可以作为起点,有的像图14一样,只有1个点能作为起点。
对于有唯一起点的情况,要想找出起点,还需要下面的定理。
定理一:在有2个奇点的有向图中,除了2个奇点之外,所有的点都满足入度==出度,
而这2个奇点中,起点满足入度==出度-1,终点满足入度==出度+1(证明略~~~)
图14中这个定理的使用:
分析点3就可以发现,点3到点2之间的线的方向是2→3而不是3→2,如图。
同理,分析点4可以发现是4→2,分析点5可以发现是2→5。
那么,点2即为起点,点1即为终点。
二,带二重平行边的图
红线的意思是,这条线必须经过2次,其实也就是二重平行边,1条红边等价于2条平行的蓝边。
理解什么叫二重平行边之后,问题就可以轻松地等价转化成前面的简单图的问题了。
如图22中,点1和点2是奇点,而且点1的出度至少为2,所以点1是起点,点2是终点。
三,带1个传送门的图
定理二:
对于2个传送门的2个端点,即黄点A和B,A的入度减B的出度一定是0或者1或者是-1
如果是1,那么A是终点,如果是-1,那么B是起点。
对于A和B之外的点,如果是奇点,就一定是起点或终点,对于A和B就不一定了。
定理二的推论:
A和B的度一定相差为2或者1或者0
1,如果相差是2,那么度大的那个点既是起点,又是终点,除了A和B之外没有奇点。
2,如果相差是1,那么度大的那个点即为起点或终点,除了A和B之外恰有1个奇点,这个点也是起点或终点。
如图33,因为点1的入度至少为2,所以点1是终点,点3是起点。
3,如果相差是0,那么又有2种情况:
(1)除了A和B之外恰有2个奇点,那么这2个点就是起点和终点
(2)除了A和B之外没有奇点,那么整个图一定是闭环,任何点都可以作为起点。
四,带绿线的图
绿线本质上是一条有向边,只不过方向不好确定。
所以说,以上提到的所有内容,对于带绿线的图同样成立。对于简单的情况,用上述内容即可解决。
但是,对于大部分情况,上述内容无法得到结果,因为绿线不是无向边,必须按照绿箭头的方向走,而绿箭头的方向却又总是变,所以定量的分析效果不大。
所以接下来,我会列举一些经典的情形,来给出一些方法。实际上,这些方法也可以用到无绿线的图中,效果一样很好。
1,基于闭环的分割(不一定保证对,但目前还没有出错过,而且有奇效)
把图分割成2个子图,一个图是闭环(多个闭环合起来还是闭环),另外一个图包含绿线。
让包含绿线的图尽量简洁,然后优先解决这个图,最后只要解决这个闭环就可以了。
例1:
例2:
例3:
(红线不是闭环,但是红线加闭环还是闭环)
例4:
例5:
对于图133,有2个点是奇点,但是不知道哪个是起点。
定理三:
如果一个图可以分成2个子图,这2个子图只有2个公共点(都不是黄点),而且这2个点就是起点和终点,那么这2个子图一定有1个是闭环。
根据这个定理,图133虽然有2个黄点,但是起点和终点都不是黄点,而且可以分成上下2个子图,所以上面的子图一定是闭环,所以只需要先解决下面的子图。
一眼看过去,很难看出上面的子图是闭环,不过确实是闭环。
2,完全分割图
随便命名的,就是指这种如果不考虑传送门的效果的话,2个部分完全分割开来的图。
如果其中有1个部分是不自相交的闭环的话,那就太简单了,起点一定在另外1个部分。
(考虑到整个图为闭环的情况,更严谨的说法应该是,起点一定可以是另外1个部分上面的点)
在另外1个部分找起点的时候,可以忽略掉传送门,这样就很简单了。
3,对称性
这2个图都有着比较强的对称性,但不是完全对称。
2个都是,2个奇点都可以作为起点
4,基于有向小闭环的消去原理
其实这个和基于闭环的分割差不多,一步步挖掘出小闭环,必须是有向的。
图109可以分成5个子图,4个有向小闭环都消去之后,就只剩1条简单的路径了。
5,基于传送门的分割
根据传送门,分割成若干块,每一块都相当于若干条连接2个传送门的线段。
很明显,她们是有主次之分的。
一般来说,主分区只有1个,其他都是次分区。
次分区的特点很明显,简单,无限制或者限制很少(限制主要指箭头)。
当然,还有一种特殊的情况,箭头特别多,但是全部指向同一个传送门,这也是一种很有趣的闭环。
最重要的是,次分区没有奇点,可以构成闭环。
这样看起来,每个分区都可以轻松解决掉。
主分区是一条路径,除了起点和终点之外,至少有1个点是传送门,所以主分区是由2部分构成,起点→传送门,传送门→终点。
所以完整的路径是:起点→传送门,第一个次分区,第二个次分区......最后一个次分区,传送门→终点。
6,基于邻居的出度和入度估计法(类似贪心算法)
我之所以总结出这样一个方法,实在是因为上面的方法对下图120几乎无效,图120实在是难的离谱。
点和边的位置关系可以分4类:
第一种,点是边的2个端点之一
第二种,点和边的2个端点都是邻居
第三种,点和边的2个端点,一个是邻居,一个不是邻居
第四种,点和边的2个端点都不是邻居
基于邻居的出度和入度估计法:只考虑和奇点形成第一种或者第三种位置关系的有向边,计算所有这样的边对奇点的入度或者出度的贡献的总和,然后比较2个奇点得到起点和终点。
首先,点1和点2是奇点,ABCD四条边都是有向边。
对于点1,只考虑ABC,对于点2,只考虑D
然后计算贡献
对于点1 A:入度+2 B:出度+1 C:出度+1 合计:贡献为0
对于点2 D:入度+2 合计:贡献为入度加2
所以,2是终点,1是起点。
注意:当2个奇点的计算值相差为2或者超过2,往往非常可信,相差为1甚至0的话就不是特别可信了。
这里面还要注意绿线的问题,如果绿线的方向可以预先确定的话,绿线也可以参与计算贡献,但是如果绿线的方向无法确定,或者特别麻烦,懒得分析这个,那绿线可以不参与计算贡献。
再看2个例子:
很明显点1和点2是起点和终点。
点1的计算值为0,点2的计算值为出度加2,所以点2为起点。
很明显点1和点2是起点和终点。
点1的计算值为0,点2的计算值为入度加1,所以点1为起点。
7,优先级原则
原则一,对于能够确定方向的绿线,优先干掉绿线
原则二,优先级,有向红边>有向蓝边>红边>蓝边
8,基于绿线的分割
有些图是由子图+绿线+子图构成的,即绿线是连接2个子图的唯一的边。
这里的子图,指的是不包含传送门或者包含2个传送门的图。
开局的时候绿箭头的方向一定就是最后通过绿线的方向,所以绿点所在的那个子图一定包含起点。
(这个子图包含绿点)