图论算法-求N阶自互补简单图

2 篇文章 0 订阅
1 篇文章 0 订阅

出处:http://www.fengchang.cc/post/151

 

题干如下:

 

第一小题我就不说了,主要说第二和第三小题。

解释一下题意,意思是说,一个简单图(两点之间最多只有一条边连接,且没有自己到自己的连接(环)),如果对该图做一个变换:任意一对顶点,原来图中两个顶点有连接边的,变成没有,原来图中两个顶点没有连接边的,变成有,则类似下面左图,变换后,就变成右图,这样变换后的图叫做与原图“互补”。如果对某图,做完这样的变换后,得到的互补图跟原图是同构的(在不改变节点之间连接关系的情况下,随意拉扯线段长度,角度后,旋转后,能够与另一个图完全重合则成为同构),则称这样的图为“自互补”图。下面这两个图例子就是自互补图(想象第二个图的两个较差边张开至90°,然后把图倒过来,就跟第一张图重合了)

 

 

第二小题是让你求4个顶点和5个顶点的所有“自互补图”;

第三小题是让你求8个顶点的“自互补图”,找到一个就好

 

这题从我们计算机人的角度看非常有意思,因为基本上我们要找的是算法,关心的是算法的时间复杂度,只要算法出来了,复杂度较低,那么求4个,5个,8个甚至100个1000个顶点也没有本质区别。

 

首先分析一下自互补图的性质。

 

第一:两个图互补的结果是如果把这两个图拼起来就能形成一个简单完全图(即任意两个顶点间都有连接边的简单图),例如上面例子中的两张图可以拼起来变成

第二:两张图如果同构,则它们顶点数和边数必然相同(不证自明)

 

一个完全图的边数为组合数:C(n,2),例如上面4个顶点的图为C(4,2)=6条边。

 

现在一个图和它的补拼起来能得到一条边数为C(n,2)的完全图,则说明这个图本身一定恰好具有C(n,2)/2的边数。

 

那么现在我们要找给定顶点数的这样的图,就是要在给定的顶点的所有边的可能组合中,先缩小范围到边数为C(n,2)/2的图,然后在找到的结果中,进一步确定该图是否是自互补图。

 

这种思路要让计算机来做,需要一个合适的数据结构来描述图,这个数据结构最适合的是矩阵,例如上面例子中的两张图用矩阵表示如下(1代表两个顶点有连接,0代表无连接):

 

 

这两个矩阵的属性有三个:

1:是对称阵

2:对角线全零,因为是简单图,不存在自己连自己的顶点;

3:所有除对角线外,相同位置值0,1互反

 

所以用矩阵来判断两个矩阵是否互补是很容易的。逐个位置检查是否符合上面3个特点即可。

 

难点在如何用矩阵判断两个图同构。刚才说了,同构就是可以通过在图上伸缩线段,调整角度,但是不改变顶点之间的关系来操作,这种几何上的操作,可以用矩阵的类似变换来表示,例如把矩阵行列上的ABCD变换一个顺序成ACBD,但保持原有矩阵顶点关系不变,例如AC原来是1,变换后AC元素虽然位置不同,但仍然是1. 那么一个不同的排列就可以代表一个不同的矩阵,所有的这些排列表代表着一组同构的图的画法。只要存在某个排列恰好和原图互补,那么原图就是自互补矩阵。

 

思路就是这样。

 

代码如下:

https://github.com/fengchangfight/selfcomplementarysimplegraph

 

试着跑了一下,按照本算法实现的时间复杂度,4阶和5阶的矩阵很容易找出全部解,6阶和7阶不存在自互补图,8阶存在,但计算量巨大,我的mac跑了几个小时才算出1个解,为了纪念一下把该解打出来:

 

0, 1, 1, 1, 1, 1, 0, 1, 

1, 0, 1, 1, 1, 1, 1, 0, 

1, 1, 0, 1, 0, 1, 0, 0, 

1, 1, 1, 0, 1, 0, 0, 0, 

1, 1, 0, 1, 0, 0, 0, 0, 

1, 1, 1, 0, 0, 0, 0, 0, 

0, 1, 0, 0, 0, 0, 0, 0, 

1, 0, 0, 0, 0, 0, 0, 0, 

 

 

这个矩阵对应的8顶点图是这样的:

 

 

这种图要通过手试,恐怕要画到猴年马月才能画出来。所以这道题如果给奥数冠军做,没有计算机的话,他也做不出来。

 

所以这种题目的难度算是高维的。

 

有没有时间复杂度更低的算法我暂时不知道,但我猜是没有,毕竟出题的这哥们之所以把8阶作为单独的一个子题目放出来,并且只要求一个不求全部,似乎已经说明了这哥们知道求全部的计算量有多大。

 

所以啊,做题要做出深度,往往才能体验作者的初衷。

 

附:

平面几何绘图工具:https://www.geogebra.org/graphing

矩阵计算器:https://matrixcalc.org/zh/

矩阵转图工具:https://graphonline.ru/en/

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值