2019独角兽企业重金招聘Python工程师标准>>>
平面图的定义为,一个图可画在平面上,使得任何两条边都不交叉。
几乎所有的图论书都这么说。。。。。我很无语,因为我写代码时,只能对计算机说,“你在平面上画画...",计算机则非常BS的对我无语。。。由此我无语。
其实从另外一个符号化描述(难得符号了,以后再集合化描述):
如果图中存在一个圈,令圈中任意在图中度为2的顶点看作边的细分(即删除),则任意两个不在圈中的顶点之间任意路径必过圈,则为平面图,否则(也即不可画)
落到计算机代码中,流程如下(前提是连通图,这个很好获得,边遍历计数):
1、收缩和删除所有度小于2的顶点,直到所有顶点度大于等于3.
2、通过不包含顶点的圈为最小圈,进行hamilton圈扩充。当然存在不可完全包含所有顶点的可能。暂定为H*圈,因为可能不符合hamilton圈的定义。
3、另所有不在H圈中的顶点为集合V。检测H圈中是否所有顶点和 V均有相连。如果存在H圈上顶点a和V不相连,则a必然在H圈上存在一条路径,有该路径的两端,b,c,在图中有直接b,c边存在。且该路径上任意顶点不和和V相邻。在H圈图(仅包含圈上的点,和点与点之间的连线)中,删除b,c边。
4、对H圈顶点做标记。如果出现交叉边存在,则不可平面。
5、对原图,将H圈上的顶点全部收缩,继续重复3.直到H圈为hamilton,或者不存在顶点。
如果hamilton圈存在,则按两个面进行边相容的存放,即先取两条交叉边,由此将hamiton图按两个面分别拆除。如果任意面中存在交叉边,则不可平面,否则可平面。。