使用plantri指南(4.5版)使用plantri指南(4.5版)======================================= Gunnar Brinkmann Gunnar Brinkmann Gunnar.Brinkmann@ugent.Gunnar.Brinkmann@ugent.be 嵌入球体中。 正好一个输出每个同构类的成员,使用几乎与生成的图的数量无关的内存量。对于同形图的验证,EDD算法非常适合于大数的运算,因此,在某些情况下,输出可能与抽象图同构。 定义 当一个图在没有边交叉的球体上绘制时,球体 因此被划分为称为面的区域。如果这张图中每个面都是连通的,那就意味着它有一个同胚图。我们可以在一个面中间的球体上开一个洞,然后把球体开成一个平面,但是我们必须记住,外部区域和其他区域一样是一个面,即使它不再是一个圆盘,其中(根据我们将采用的任意选择)如果我们从外部观察球体,顺序是顺时针的|起到了〈以上例子中,a={3,3},b={2,3},b={2,3},c={2,3},c={2,4},d={2,4},d={2,4},d={0,3},e={1,4},e={1,4},f={0,4},f={0,2},g={1,2}。{1,2}。 嵌入的方式是以顺时针顺序将边缘按顺时针顺序排列的边缘,将 每个顶点: 0:0:d,d,0:d,c={2,4},d{0,4},f 1:e,g2:b,c,g,f3:a,b,d4:a,c,e 注意循环顺序b,c,g,f与c,g,f,b相同,起点无关紧要。 要完全表示嵌入图,我们需要抽象图 和循环边阶。对于没有平行边的图(不止一条边具有相同的端点),传统的做法是按顺时针顺序列出相邻边,同时给出两条边:0:2,3 1:2,4 2:0,3,4,2:1:0,4,2 4:1,2,3;稍后我们将描述一种通过循环表示具有平行边的图的偶数嵌入的约定邻域表。嵌入图的镜像是通过颠倒所有的 循环顺序得到的。上图的镜像是\1---2--------0 g f 在定义两个嵌入图的“同构”时,我们可以选择是否自动将一个图及其镜像视为 同构。plantri知道这两个定义: 设G和H是两个顶点数目相同、边数相同的两个连通嵌入图。 从G到H的保向(O-P)同构是从V(G)到V(H)的双射fv ,E(G)到E(H)的双射fe,因此 (1)如果E={v1,v2}在E(G),那么fe(E)={fv(v1),fv(v2)}和fe(e) 在e(H);(2)如果(e1,e2,…,ek)是与G的顶点v,顺时针方向相关的边的集合,那么(fe(e1),fe(e2),…,f(ek))是顺时针方向与G的顶点fv(v)相关联的 边集。 从G到H的方向反转(O-R)同构是从v(G)到V(H),以及从E(G)到E(H)的双射fe,使得 (1)如果E={v1,v2}在E(G),那么fe(E)={fv(v1),fv(v2)}而fe(E) 在E(H)中。 (2)如果(e1,e2,…,ek)是与G的顶点V相关联的一组边,则(fe(e1),fe(e2),。。。,f(ek)是与G的顶点fv(v)按逆时针顺序关联的 边集。 注意,这两个定义只在倒数第二个词中不同。 从G到H的同构是O-P同构或O-R 同构。同构和O-P同构(但不是O-R同构)是等价关系,所以我们可以说同构类和O-P同构类。同样地,嵌入图的所有同构集合和 集合所有O-P同构(但不是所有O-R同构的集合) 自同构群和O-P自同构群构成了 自同构群和O-P自同构群,我们可以形成另一个嵌入图,称之为 平面对偶(或仅对偶)D。D的顶点是G的面。D的边与G的边成1-1对应关系:D中一条边的两个端点是G中相应边任一侧的面。最后,D中顶点(G中的面)周围边的循环顺序是G中面边界的相应边的顺时针顺序。图2中的图有 以下对偶项: ------------------------- | | | | | | | | | |/a | | |/C------D |/C/b | |/e/|图3. A--------b | | | | | | | | | | | | | | | | | | |/e/|图2的外表面。注意,对偶图的 面对应于原始图的顶点。事实上,不难看出嵌入图的对偶是原图。还要注意原始图中 次顶点的存在如何导致对偶图中的平行边。 如果嵌入图的所有面都是三角形(即由3 边包围),则嵌入图称为三角剖分。文献对外表面是否一定是三角形存在分歧,但我们认为所有面都是三角形。三角剖分的对偶是一个嵌入的三次(三价)图。有n个顶点的三角剖分有 正3n-6条边和2n-4个面。 一个图(嵌入或不嵌入)如果不能通过 移除k个或更少的顶点而断开,则它是k-连通的。对完全图K4的定义作一点修改是方便的:它是3连通的而不是4连通的。一个标准定理说,一个三角剖分是3连通的,当且仅当它没有环或平行边时。当k大于5时,平面图是不可能k连通的。如果不可能去掉k个或更少的顶点,使图分成至少两个有圈的组成部分,则图(嵌入或不嵌入)是循环k连通的。如前所述,K4被定义为周期性 3-连接,但不是周期性4-连接。平面图可以具有任意高的循环连通性。在许多情况下,嵌入图的连通性与其对偶图的循环连通性之间存在关系。例如, 一个三角剖分是k-连通的,当且仅当它的对偶是循环的 k-连通的。 一个简单的图形是没有平行边或循环的。 安装plantri。 可以从 http://cs.anu.edu.au/~bdm/plantri plantri.c是一个以单个文件plantri.c编写的c程序。它应该使用大多数现代C编译器立即编译,因为它只包含非常标准的 代码。(我们唯一没有测试的是16位算术的使用。如果可以,请确保类型“int”为 至少32位); 要在Unix下编译plantri.c,可以使用 cc-o plantri-O4 plantri.c,其中“4”是编译器接受的最高数字,或者只需 make plantri(但先检查makefile)。 运行plantri。 要运行plantri,您需要能够输入命令行参数。。我们所有的例子都将使用标准的Unix语法。 plantri运行的一个例子是: plantri-d16 ,这使得具有16个顶点的3连通三角剖分的对偶(因为-d存在)。在其他的图中,它是唯一的平面顶点数。这也可以表示为“28d”(后缀“d”表示“dual”) 在这种情况下,它通过加4然后除以2来转换: (28+4)/2=16。在三角剖分的情况下,此计算得到 面数,即对偶三次图中的顶点数。 除了一个强制参数外,还有三种可选的 参数: *开关由“-”字符引入。如果有多个 它们可以任意连接或分开。它们也可以出现在任何地方。例如,这些命令行都是等价的: plantri-m4u 10 plantri-u-m4 10 plantri 10-um4 plantri-u 10-m4 下一节将解释这些开关的含义。 如果开关使用数值,例如-m,则给它不带值与给定值相同0也就是说,-m与-m0相同。如果您希望将图形发送到标准输出之外的其他位置,则可以给出一个输出文件。除图形以外的信息(如 统计信息)将写入标准错误流。允许 使用单独的“-”显式请求图形输出到标准输出。示例: plantri 20 tri.20--将20个顶点三角剖分发送到文件tri.20 *可以指定RES/MOD对,以仅选择 否则将生成的图形的一部分。这对由两个整数组成,中间有 '/',例如13/100。第一个整数可以是0到比第二个数字小1 。本例从第0、1、…、99部分中选择第13部分。总的来说,这100个部分将把所有的图分成100个大致相等的部分。提供此选项是为了使您能够将计算任务划分为可管理的大小。 有关RES/MOD对的详细信息将在后面给出。 参数和开关可以以任何顺序出现,但有一个例外: 强制参数(顶点数)必须位于任何 输出文件或RES/MOD参数之前。 输出格式。。plantri可以用各种不同的格式编写图形。 平面代码是默认格式。如果您计划将图形输入需要嵌入的程序中,则它是首选格式,如果您不需要嵌入,则也很方便。然而,这是不适合人类阅读的平面代码。图的顶点由以“a”开头的ASCII字符命名。例如: 7 bcdefg,agfdc,abd,acbfe,adf,aedbg,afb 这是一个有7个顶点a,b,c,d,e,f,g的图。 'a'的邻域按顺时针顺序是b,c,d,e,f,g,依此类推。每个图形占用 一行输出。如果您只想手工绘制一些图形,则Ascii代码非常方便。 要选择Ascii代码,请使用-a. 边缘代码是平面代码的另一种选择,它使所有平面图 即使存在多个循环,也能对所有平面图进行明确编码。 要选择边缘代码,请使用-E. GRAPH6是用于抽象结构的紧凑代码如果你不想用这个图来表示,那就用这个图吧。它也仅限于简单的 图。graph6是Brendan McKay的 “nauty”包支持的格式之一。每个图占用一行。 要选择graph6代码,请使用-g. SPARSE6是一个紧凑的代码,用于图的抽象结构,它是针对稀疏图进行优化的。如果你不想嵌入并且正在处理20个或更多顶点的立方体图,sparse6是一个很好的选择。sparse6是Brendan McKay的 “nauty”包支持的格式之一。每个图形占用一行。 要选择sparse6代码,请使用-s。 除ascii代码外,其他格式都有一个标准标题,可以在开头写入输出: 默认情况下写入格式头?平面代码>>平面代码<<yes 边缘代码>>边缘代码<<yes 图形6>>图形6<<no sparse6>>sparse6<<no 在每种情况下,标题在 之后都没有行尾字符(出于可移植性原因)。如果要在默认值不为 To或反之亦然,请使用-h. 如果您只想计数图形而不写入它们,请使用-u 选择不输出。 这些格式的详细信息在附录a-C. 其他开关中给出。 -d导致写入双图形而不是原始图形。 请注意,它是应用的只在输出阶段。所有其他开关 参考原始图形之前,采取双重。例如, -m4(最小度数至少为4)表示原始图,而 不是对偶图。 -o通常,每个同构类的一个成员被写入。如果给定了这个 开关,则会写入每个O-P同构类的一个成员。 由于graph6和sparse6格式无论如何都不会对嵌入进行编码, 如果使用-g或-s,则会忽略此开关。 -O还意味着-g. -g此开关仅在使用插件时才有意义(请参见附录D)。它确保对每个输出图计算出完全自同构群。如果不使用插件, -G只会减慢速度。 -V只输出带有非平凡组的图形。如果给定-o,则使用 o-P组。否则,整个组。意味着-G. -v plantri将始终告诉您(通过标准错误的消息)所生成的图的数量。如果指定-v,它可能会告诉您一些额外的统计信息。例如,如果 您使用-o,-v将使它同时通知您 同构类的数量以及与其镜像映像同构的同构类的数量 选择图形类。 在这些说明中,“primal”一词指的是如果您不使用-d,“dual”指的是该图的dual(用-d代替它)。 字符#表示一个非负整数。 我们从几个在多种情况下可用的开关开始。 -m#指定最小阶数的下界。在对偶图中,这意味着最小面尺寸的下限。默认值为-m3。 -c#指定连接的下限。双 图中的含义将在每种情况下解释。默认值为-c3。 (c4与-q的含义稍弱,请参见下文。) -x与-c结合使用时,连接必须正好是#, ,而不是至少是#。(以下是一些例外情况。) 现在我们可以解释plantri可以生成的图形类。-b而不是-p 选择欧拉三角剖分,其中“欧拉”表示每个 顶点都有偶数阶。-除了默认的 -m4(最小度数始终为4)之外,m不可用。 -c3(默认)3-连通欧拉平面三角剖分。 -c4 4-连通欧拉平面三角剖分。 对偶是一个循环4-连通的二部立方图 -c3x-c3和-c4之间的区别,即那些3连通的欧拉平面三角剖分有一个三角形不是一个面。 -p而不是-b 选择一般平面简单图。在3连通的情况下,这些 也被称为凸多面体。请注意,同构是根据球体上的嵌入定义的,这意味着如果连通性小于3,输出 可以同构为抽象图,最小度至少为1。 -m2最小阶数至少为2。 -m3(默认)最小阶数至少为3。-m4最小度数至少为4。 -m5最小度数至少为5(因此正好为5)。 -c3(默认)连接至少为3。 -c2连接至少为2。 -c1连接至少为1。 -c2x-c2和-c3之间的差异,即连接性正好是2。 -c1x-c1和-c2之间的差,即连接性正好是1。 如果使用-c开关而不是-m开关,则最小度数 设置为相同的值。例如,-c2与-c2m2相同。 如果使用-m开关而不是-c开关,则假定为3-连通性。这意味着-m1和-m2在不使用 -c1或-c2的情况下无效。 此外,还可以施加两个限制: -e指定边数的边界(这等于dual中的 个边数)。最多有4个边š个边š个数š个边š最多可有2个边š个 个边š最多可有 个边š个 个边š个#个边š最多有个 个边š个š个#个 个#个#个#个š个#个#个#个#-e#:从#到#的边数仅有效地实现下界。一般来说,一次进行一系列边缘计数比一次只进行一个边缘计数更有效。 -f#指定一个面大小的上限(在dual中:最大程度的 上限)。默认值为无边界。 对于n个顶点,最大面大小可以从3到n-1。 -bp或-pb 选择一般平面简单二部图。这些是由-p单独生成的类的一个子集,即二分的类。 最小阶数始终最多为3,因此除了-m4、-m5和-f3、-p可用的所有参数都可用。 对偶是平面欧拉图的一个子类。 对于-c3,对偶图是三连通平面欧拉图。 -P#选择圆盘的三角剖分。这些都是嵌入简单的图形,有一个突出的“外”面。外表面可以是任意大小 (这里称为磁盘大小),但其他面必须是三角形。 -P的参数是磁盘大小。如果未给出参数(或0),则允许所有磁盘大小。如果需要所有的磁盘大小,那么一次完成所有操作要比一次完成一个要高效得多。 除了外表面,所有顶点的阶数必须至少为3。 根据-m参数,可以允许2阶顶点。此外,可能存在的唯一2个切口是外表面的 弦:它们允许用于-c2,但不适用于-c3。 由于外表面上2度顶点意味着弦,因此 组合-m2c3与-m3c3相同。 -c3m3(默认)无弦,不允许顶点阶数2 -c2弦,不需要顶点阶数2 -c2x弦,不允许顶点阶数2 -c2m2和弦,允许2度 -c2xm2和弦,允许2度 我们有c2P=c3m3P+c2xP和c2m2P=c3m3P+c2xm2P。 当从v-w看输出图时,v-w是一条 边,外表面在左边, 其中v是第一个顶点,w是第二个顶点。 对于双输出,第一个顶点对应于外部 面对。对偶图是一个除了第一个顶点外,每个顶点都是 度3的图。 解释输出时,请记住外表面是可区分的,这在确定 同构时是考虑在内的。这意味着,例如,一些外表面尺寸为3的输出将同构为抽象图,即使在 -q选择简单四边形。这些是简单的平面图,每个面都有4个长度。对偶图是平面四次 图。 -x未实现。 -c和-m的有用组合如下: -c3m3(默认)3-连通 对偶:3-连通简单四次图 -c2m2任意 对偶:4-边连接(可能不简单) 四次多图 -c2最小次数3 对偶:4-边连通简单四次图 -c4 3-连通,无面4-圈 对偶:3-连通,6-圈边连通 (简单)四次图 如果没有-b、-q、-p和-p,则发现的图是三角剖分图 仅受连通性限制最低学位。在这种情况下, 存在低于3的连通性。 -c、-m、-x和-t的有用组合是: -c3m3(默认值)3-连通平面三角剖分。对偶图是一个3连通的平面立方图。 原图和对偶图都很简单。 -m5最小阶数为5的3连通平面三角剖分。 对偶图是一个没有面 小于五边形的3连通平面立方图。原始图和对偶图都很简单。 -c5 5-连通平面三角剖分(意味着最小阶数为5); 对偶图是一个循环5-连通的平面三次图。 -m5c4最小阶数为5的4-连通平面三角剖分。对偶图是一个循环4连通的平面立方图,没有比五边形小的面。原始图和对偶图 都很简单。 -m5c3x 3连通平面三角剖分,最小阶数为5 且至少有一个非面三角形。对偶图是一个 3连通的平面三次图,没有面小于 五边形,但至少有一个循环3割。原始图和 对偶图都是简单的 -m5c4x三连通平面三角剖分,最小次数为5 且至少有一个分离的4-圈。对偶图是一个 4连通的平面立方图,没有面小于 五边形,但至少有一个循环的4割。原始图和 对偶图都是简单的。 -m4 3连通平面三角剖分,最小次数至少为4。 对偶图是一个没有三角形的3连通平面三次图。原始图和对偶图都是简单的。 -c4 4-连通平面三角剖分(意味着最小度数>=4)。 对偶图是一个循环4-连通的平面三次图。 -m4c3x 3-连通平面三角剖分,最小度为 4和至少一个非面部三角形。对偶图是一个 3连通的平面三次图,没有三角形,但至少有一个循环三割。原始图和对偶图都很简单。 -c2最小阶数至少为3的2连通平面三角剖分。 可能存在平行边(但请记住,这是一个三角剖分 因此每对图之间必须有东西)。没有循环。对偶图是一个2连通的简单平面三次图。-c2x与-c2相同,但必须至少有一对 平行边。在对偶中,至少有一个尺寸为2. -c1 1-连通平面三角剖分,最小阶数至少为3 且没有两个面共享多个边。可以有平行的边和环。对偶图是一个1-连通的简单 平面三次图。 -c1x与-c1相同,只是必须至少有一个循环。 -c1t至少有一个顶点的一个割集。 -c1t 1-连通平面三角剖分,最小次数至少为3。 对偶图是1-连通的平面三次图,可能有双边缘,但没有尺寸小于3的面。 -c1tx与-c1t相同,但必须至少有一个循环。 在dual中,至少有一个顶点的一个切集。 我们有c2=c2x+c3,c1=c1x+c2,c1t=c1tx+c2。 还有m4=c4+m4c3x,m5c4=c5+m5c4x,m5=c5+m5c4x+m5c3x。 有关RES/MOD拆分的更多信息。 由可选的RES/MOD参数选择到plantri的特性是其最大的优点之一。对象集被分成mod disjoint 类,只生成res-th类。需要 0<=res<=mod-1。分裂的设计使得500MHz机器每次运行的开销最多为5秒。另外,对于总共有很多对象的问题,mod的值至少可以达到10000,并且类大小仍然是合理的一致性的。 类的定义遵循模算术的正常规律,1/5类是1/10和6/10的并集(因为数字 等于1模5是等于1或6模10的数)。这 允许在需要时将类进一步拆分为更小的部分。 要确定拆分的实际成本和可用的最大数量的类,请运行程序plantri_s(makefile已知)。 例如: %plantri_s-b 30 219258 level=21拆分案例;cpu=2.97秒,这意味着拆分为最多219258个案例是可行的(尽管如果你使用那么多的话 拆分将不会非常统一),并且每次运行的成本大约为3秒。(在本例中,这意味着 使用400个类只会产生1%的拆分惩罚。) 插件可以通过在 扩展插件 初始化 附录a.平面代码的定义中定义splithint来更改拆分级别 平面代码是plantri的默认输出格式。图的顶点从1开始编号。平面代码用一系列字节表示图形,这些字节的无符号数值(0..255)是有效的。第一个字节给出顶点数n。然后有n个部分,其中v部分按顺时针顺序包含顶点v的邻域,后跟一个零字节。例如,图1的图形由以下字节值表示: 5 3 4 0 3 5 0 1 4 5 2 0 1 5 0 1 5 0 1 5 0 1 5 0 1 5 3 0 2 3 4 0 如果存在平行边,则可能有多个图 其平面代码在相邻列表旋转时相同。为了解决这种模糊性,plantri制定了以下约定: 对于除第一个顶点外的每个顶点v,如果以v作为邻居的最小编号的 顶点是w,在第一个图中,对于第一个图的所有类,第10v个类中的所有类都有一个生成,可以证明,对于每一个v>1,我们都有w<v,并且嵌入的图可以从代码中唯一地重构。 除了图形的编码之外,默认情况下,平面代码文件 以15个字符开始>>平面代码<<不带行尾 字符。 附录B。边缘代码的定义。 边缘代码是一种平面码,其优点是对所有平面图(即使有多个回路)都是唯一可解的,。。。连续的但没有特定的顺序,并且对于每个顶点,以顺时针顺序给出了入射边数的列表。注意,在这样的列表中,循环出现了两次,通常每个边编号总共出现两次。标题有两种形式之一: 1。值为1-255的单字节。在本例中, 字节的值是正文的大小(以字节为单位)。主体中的所有边数将使用L=1字节进行编码。存储在K字节中的字节0、字节(K<<4)+L(其中1<=K,L<=15)和bigendian无符号数S。在这种情况下,S是主体的大小(以字节为单位),L是主体中用于边数的字节数。头的大小是1+1+K字节。 主体为每个顶点都有一个部分。在每个部分中,入射边的边数按顺时针顺序给出,每个边都使用一个L字节的bigendian整数。除最后一个外,每个顶点部分后面都有一个值为255的单字节。(注意,这意味着L足够大,最大的边数最多有第一个 字节值。) 在plantri中,第二个报头类型的唯一可能是K=2,L=1。 除了图形的编码之外,默认情况下,边缘代码文件 以13个字符开头>>边缘代码<<无行尾 字符。 附录C.GRAPH6和SPARSE6的定义。 此描述中的所有数字都是十进制的,除非明显是 二进制。GRAPH6和SPARSE6是文本格式,包含 它们的文件是一个文本文件。 除了头,每行有一个对象。除了 头和行尾字符,所有字节的值都在 范围63-126(都是可打印的ASCII字符)。 位向量: 长度为k的位向量x可以表示为如下。示例:1000101100011100 (1)在右侧填充0,使长度为6的倍数。 示例:100010110001110000 (2)分成每组6位。 示例:100010 110001 110000 (3)每组加63,将它们视为bigendian二进制数。 示例:97 112 111 然后每个字节存储一个值。因此,所需的字节数为上限(k/6)。 让R(x)将x的表示形式表示为一个字节串。 让n是0-262143(262143=2^18-1)范围内的整数。 如果0<=n<=62,则将n(n)定义为单字节n+63。 如果n>=63,则将n(n)定义为四个字节126 R(x),其中 x是n. 的bigendian 18位二进制形式示例:n(30)=93 n(12345)=n(000011000000111001)=126 69 63 120 GRAPH6格式: 假设G有n个顶点。将G G的邻接矩阵邻接矩阵的上三角写为位向量x,长度为n(n-1)/2,利用顺序 (0,1),(0,2),(1,2),(0,3),(1,3),(2,3),…,(n-1,n)的顺序 然后将图表示为n(n)n)R(x)。 例如:假设n=5,G的G有边0-2、0-4、1-3和3-4的边缘为0-2、0-4、1-3和3-4。 x=0 10 010 1001 然后n(n R(x)=R(010010)图的格式:10se81'或'10se99'不能表示'10se68'的图形。(这是为了区分 代码与GRAPH6格式);(2)顶点数。;(3)边列表。;(4)行尾 支持循环和多个边,但不是有向边。 顶点数n:用n(n)表示,如GRAPH6格式。 边列表: 设k为二进制中n-1所需的位数。 其余字节编码序列R(z),其中 z=b[0]x[0]b[1]x[1]b[2]x[2]。。。b[m]x[m]… 每个b[i]占用1位,每个x[i]占用k位。 选择结尾处的填充,以便 以下的解码算法不包含任何伪边。 图的顶点为0..n-1。 由此确定由该序列编码的边: v=0 对于从0到m的i,do 如果b[i]=1然后v=v+1 endif; 如果x[i]>v then v=x[i]else输出{x[i],v}endif endfor 示例::Fa@x^ ':'表示sparse6格式。 从其他字节中减去63,并以二进制形式写入,每个字节6位。 000111 100010 000001 111001 011111 第一个字节不是63,所以它是n。n=7 n-1需要3位(k=3)。以1和k为一组写入其他位: 1 000 1 000 0 0 1 1 110 0 101 1 111 这是b/x序列1,0 1,0 0,1 1 1,6 0,5 1,7。 结尾的1,7只是填充。 其余对给出边缘0-1 1-2 5-6。 为plantri编写插件 plantri具有进行某些编译时更改的功能它的行为。这就需要对程序如何工作有一定的了解,下面我们将介绍一点这方面的知识。插件的一个典型用途是在写入输出图之前对其进行过滤。 如果您只需要图形的某些子集,这是一个好主意,因为plantri的速度非常快,将图形写出并读入另一个程序所需的时间与生成图形的时间差不多。 plantri中的顶点从0开始编号。有全局变量nv和ne包含顶点数和有向边数(是边数的两倍); 在圆盘三角剖分的情况下,有时 一个顶点数不可用。在本例中,全局整型变量 missing_vertex指示缺少的内容。如果没有遗漏, 缺失的顶点<0。例如,如果nv=7且缺少 顶点=2,则 顶点实际上编号为0,1,3,4,5,6,7。 图形被保存为有向边的集合(类型EDGE)。 这些边是指针引用的结构。它们有这些 字段,其中包括: int start;边开始处的顶点 int end;边末端的顶点 edge*inverse;与此相反的定向边 edge*next;围绕顶点start edge*prev;顺时针顺序的上一条边在vertex start 周围有一个数组firstedge[0..],键入EDGE*;firstedge[i]的值是指向从顶点v开始的一条边的指针。例如,要“查看”顶点v的所有邻域: EDGE*e,*elast; e=elast=firstedge[v]; { look at e->end;;e=e->next; }while(e!另一个例子是脸部的追踪。假设我们有一个边e,并且 我们想“看”e右边面边界的所有边!=elast); 如果您对e左边的面感兴趣,请使用e=e->inverse->next。另一个有用的全局数组是degree[0..],它包含顶点的 度。另一种“查看”顶点v的所有邻域的方法是: for(count=degree[v],e=firstedge[v];--count>=0;e=e->next) {look at e->end } 要编写插件,您需要在一个单独的源 文件(我们称之为plugin.c)中定义一些内容,并使源文件名在编译plantri.c时可用。例如,在大多数Unix系统上: cc-o plantri_plugin-O4'-DPLUGIN=“plugin.c”'plantri.c 这两种类型的所有引号都是必需的。 此过程会导致plugin.c的文本被读入 plantri.c的文本中,因此,在每个文件中定义的所有内容在这两个文件中都是可用的。 插件的工作是通过定义宏来实现的。这里我们列出可能定义的宏及其含义。如果您不想使用这些函数,就不要定义宏。 FILTER这是一个过程的名称,它为通常输出的每个同构类型的图形调用(除了在-d的情况下,它是取 dual之前的原始图形)。调用序列如下: intfilter(intnbtot,intnbop,intdoflip) 过程必须返回一个int值。如果返回值0,则不写入图形。参数的意义: nbtot=自同构的总数 nbop=O-P的规范标号数 如果有O-R自同构,nbop=nbtot/2,如果 没有nbop=0或nbop=nbtot。如果存在方向反转自同构,则 doflip=0,否则只有在给定-G或-o时,才保证nbtot、nbop、doflip正确。在这种情况下,可以使用完全自同构组; 联系作者了解详细信息。 没有-G和-o,doflip=0,其他参数未定义。 这些规则意味着doflip+1是要编写的图的数量(除了嵌入的不敏感格式graph6 和sparse6,只为其编写一个)。如果使用 FILTER对具有特定属性的输出进行计数,请使用doflip+1的权重对每个 图进行计数。 此过程可用于以其他格式编写图形。 正常输出文件(打开的文本文件)是outfile,除非 如果给定-u,在这种情况下,您必须自己打开一个文件或使用stdout. SUMMARY,在plantri生成最终的 SUMMARY统计数据之前,将在计算结束时调用此函数。类型: void SUMMARY(void) 其主要用途是写入由过滤器和其他插件组件收集的信息。如果您不希望也使用普通摘要,请在返回前将全局变量dosummary设置为0。 查看plantri.c以查看统计信息是如何收集和写入的。 所有统计信息都应写入文件msgfile。 PLUGIN u INIT这是在执行开始时调用的,在 命令行开关被解码后,但在生成任何图形之前。您可以使用它来执行以下任务: (a)测试开关是否对此插件有效。 (b)将开关值设置为适当的默认值。 (c)初始化此插件使用的数据结构。 插件开关可以定义此选项以添加额外的开关。检测开关及其值的机制可以通过 检查plantri.c得到最好的解释。这里有两个简单的例子: (a)添加一个布尔开关-z: #define PLUGIN_switches else if(arg[j]=‘z')zswitch=TRUE;(b)添加一个接受整数值的开关-z: #定义PLUGIN_开关else if(arg[j]='z')\ zvalue=getswitchvalue(arg,&j);在每种情况下,您都必须定义并初始化新变量。 您可以在plugin.c中的顶层执行此操作: (a)static int zswitch=FALSE; (b)static int zvalue=-1; 检查zvalue是否有效,或者如果没有指定 即仍然是-1,则给它一个默认值使用PLUGIN 如果您更改了开关,还应该重新定义plantri.c第一行中出现的宏 开关。它仅用于错误消息中。 PRE FILTER_x这些是最难使用的宏,因为需要相当多的程序内部知识。plantri的操作方法是从所需类中最小的图开始,然后一次将它们展开几个顶点,直到达到输出大小。展开图形的确切方法取决于图形类。PRE_FILTER_x的值是一个 表达式,在生成过程中计算出的每个中间图比输出大小小(或在其他意义上构造得更少),对其进行求值。如果 表达式的值为0,则不会展开该中间图形(因此其子图形的任何子图形都不会出现在输出中)。如果值不为0,则展开正常。 可用的实际宏有 PRE_FILTER_SIMPLE,PRE_FILTER_MIN4,PRE_FILTER_BIP, PRE_FILTER_POLY,PRE_FILTER_DOUBLE,PRE_FILTER_ORDLOOP, PRE_FILTER_SPECIALLOOP,PRE_FILTER_QUAD,PRE_FILTER_MIN5. 还有一些更复杂的宏可用,但是描述它们需要太多关于plantri内部结构的细节 一些插件的例子是与plantri一起分发的: mdcount.c(makeplantri_mdcount)-count graphs by minimum degree degseq.c(makes plantri_deg)-按度数序列计数图形 nft.c(makes plantri_nft)-按非面三角形计数图形在这个图中,我们给出了一个最大的平面数可以使用plantri生成的图形类。如果你在这些类中计算出任何额外的数字,请将它们发送给我们以供包含。 这些表中的列标题是: nv=顶点数(或对偶中的面) ne=边数(在dual中相同) all=同构类的计数 O-P=保持方向的同构类的计数。----------------------------------------------------------------三连通平面三角剖分(plantri); nv ne nf all O-P 4 6 4 | 1 1 6 12 8 | 2 2 7 15 10 | 56 8 18 12 | 14 17 | 9 21 14 | 50 73 10 24 16 | 233 389 11 27 18ӡ1249 2274 12 30 20 | 7595 14502 | 13 33 22 97033 14 36 24 | 339722 672781 e 15 39 26 |第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第三年第四年第四年第三年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年在7171613842488 23 63 42 | 28615703421545 572310890625 至少4次的3个连通平面三角剖分 (plantri-m4)和4个连通平面三角剖分(plantri-c4)。 m4 c4 nv ne nf所有O-P所有O-P 6 12 8 | 1 1 | 1 1 | 8 18 12 | 2 2 | 2 2 2 | 9 21 14 | 5 5 |4 | 10 24 16 | 12 14 | 10 12 | 11 27 18 | 34 45 | 25 32 12 30 20 | 130 194 | 87 128 | 13 33 22 | 525 891 | 313 519 | 14 36 24 |2472 4499 | 1357 2430 15 39 26 23603 11765 16 42 28 | 65619 127887 | 30926 59915 17 45 30 | 357504 705770 | 158428 311744 18 48 32 | 1992985 3959653 | 8367491659633 | 19 51 34 | 11284042 22494163 | 4504607 8971845 20 54 36 129227103 49195863 21 57 38 | 375126827 749646288 2729440855 | 21944398 4387116659 | 765598927 1530417953 | 23 63 42 | 12941995397二〈24 66 44〈76898924247689242474742476890027476765144588〈242424242424444444322〈25 69 46〈4598739130 919797049272 2843939465001〈26 72 48〈2767364341936 5534600206〈8236875670116473277455726〈27 75 50〈167474747732792〈167474747732792〈167237373732792〈167474747732792〈167474747732794〈〈〈〈124; 4801749063379 注:安此表的早期版本为nv=23行的第一个计数提供了不同的值。这是由于笔误所致,而不是程序错误。 ---------------------------------------------------------- 无3-连通性要求的平面三角剖分: 2-最小度数至少为3(plantri-c2) 1-最小度数至少为3,且没有两个面共享多个边(plantri-c1) 1-与至少3阶连通(plantri-c1t)。 这些连通性是下界,不是精确值。 c2 nv all O-P 4 | 1 1 1 6 | 3 3 3 7 | 8 9 8|32 37 | 9 | 131 183 10 | 723 1156 | 11 | 4360 7713 12 | 29632 55436 13 | 213168412193 | 14 3158392 15 24736138 16 | 99141919 197448348 | 17 | 802392930;1601481238 | 18 | 6593377305 13173471151 19 | 54883010885 109712447949 | 462038444588 923858502128 21 | 392889849911 7856893675780 c1 c1t nv所有O-P 4 | 1 1 |1 5 | 1 1 | 6 | 3 3 | 7 | 9 10 | 8 | 37 42 | 38 43 | 9 | 172 230 | 178 23610 | 993 1523 | 1041 1577 | 11 | 6308 10737 12 | 44145 80319 | 46738 84194 13 | 327051 62034 653271 | 2530761 4913112 | 2691419 5198809 | 15 |2010年79785 39705720;21509955 42184083〈16〈164672106 326420796〈175969274 3480277〈17〈1368137926 2723097802〈124;146321468 296767487〈18〈11536196188 23012381739〈12395111621 2470425434〈19〈9849494508358 19671373776094〈124 12395111621 2470434〈19〈19〈9849494508358 196713776094;106126124124242424247474〈10612624249031 2171856940558〈10612624249031 2111856940558 1856940558〈18〈18 10;20 |8500739367501698875856077 | 918520748281 1835160731391 21 | 7406965136219 14808015829668 | 8025676381104 16042357404748 3-连通平面欧拉三角剖分(plantri-b), 和4-连通平面欧拉三角剖分(plantri-bc4)。。第1-12页1 1 | 0 | 10 24 16 | 2 2 | 2 2 2 | 12 30 20 | 8 9 | 5 6 | 13 33 22 | 8 11 | 3 3 3 |14 36 24 | 32 41 | 18 22 | 15 39 26 | 57 89 | 19 25 16 42 28 | 185 296 | 79 112 | 17 45 30 | 466 829 | 134 214 | 18 48 32 | 1543 2772 | 501817 19 51 34 | 4583 8746ジ2058 | 20 54 36 29461 | 3976 7188 21 57 38む50116 98342 | 11055 21036 | 22 60 40 | 171168 336881 | 37231 71185 | 23 63 42 | 582603 1156559| 114560 224103 | 24 66 44 | 2024119 402477 | 384053 753561 25 69 46 | 7057472 14075250 246435 26 72 48 | 2483248 49638364 | 4193857 8321649 | 88111772 176037177 | 13977946 27841706 28 78 52 |第四年第四年第四年第四年第四年第四年第四年第四年第二年第四年第三年第四年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第三年第四年第二年第三年第三年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第四年第二年第四年第二年第四年第二年第四年第四年第二年第四年第三年第四年第三年第三年第三年第三年256710瓦33 93 93 62〈195015189626 390009407529〈227 9304725857625554〈34 96 64〈71440425915187557040〈79449718217 15865787212〈35 99 99 66〈2626130395699 5252155792165〈277760027415452882736〈36 102 68〈96850771313079〈97483611245457〈〈68〈96850771313079〈97484836112457〈〈〉〉---------------------------------------------------------------------------〈能否------------------------------------------------------------〈能否-------------------------〈〈10凸多面体(3-连通平面简单图,plantri-p)、 和最小阶数至少为4的凸多面体(plantri-pm4)。 p pm4 nv all O-p all O-p 4 1 1 | 5 2 2 2 | 67 8 | 1 1 7 34 45 | 1 1 8 257 419 | 4 4 9 2606 4798 | 14 16 10 32300 62754 | 67 99 11440564 872411 | 428 720 | 12 6384634 12728018み3515 6531 13 96262938 192324654 | 31763 61677 14 1496225352 2991463239 | 307543 607787 15 23833988129 47663036427 | 3064701 6101800 | 16 387591510244775158142233 | 31199068 62288750 17 641585130241 12831576165782 644101914 18 107854282197058 | 3369911732 6738127018 | 35611596455 7121647022 20 | 379881408164 759735751770 21| 4086847012014 8173585336482 ---------------------------------------------------------- 圆盘的三角剖分:3-连通(plantri-P),或完全 2-连通,但没有2度顶点(plantri-Pc2x), 或完全2-与外表面2度顶点相连(plantri-Pc2m2)。P nv所有O-P 4 1 1 5 2 2 6 7 8 7 27 37 8 132 213 9 773 1386 10 5017 9524 11 3486168057 12 253676501858 13 1903584 3788747 14 14616442 29170667 15 114254053 228295618 16 906266345 1811802818 17 7277665889 14552804492 18 590665524810 118124257451 19 4838641124 96769804455 20 3996427278475 799274642796321 33250623548406 66500865364037 Pc2x Pc2xm2 nv所有O-P全部O-P 3 | 1 1 5 |2 2 d 6 1 1 | 9 12 7 4 5 | 36 56 8 27 42 | 196 341 | 9 163 289 | 1160 2168➓10 1131 2130 |7616 14732 11 8030 15631 | 52605 103619 12 59412 117319 753336 13 448361 891666 5610649 | 14 3447550 6877352 | 2136363658 42666989 | 15 26887369 53713758 | 165164873另〈17 1695218973 3368687444年〈10312929335252206234232424〈18 13666153626 329645755〈829592352 16599929181〈19 111136594337 2263795690〈674004472100 1347979078869〈20 910954545329 1821885598755 16599929181181〈19 111136594337 2263795690〈674004472100 1347979078869〈20 91095454545321821885598755〈5524242440098252592〈55242424400982592〈20年20 91095454545321821885598755年〈55242424在11048696658907 21 752070838434 15041292477945 | 4563748298918 91274524809807 ------------------------------------------------------3-连通平面三角剖分(plantri-m5), 和3-连通平面图(凸多面体),最小阶数为5 (plantri-pm5)。所有三角形1 1 e 15 39 26 | 1 1 | 16 42 28 | 3 4 | 5 6 | 17 45 30 | 4 4 | 8 8 | 18 48 32 | 12 17 | 30 46 1951 34 | 23 33 | 85 135 | 20 54 36 | 73 117 | 392 686 21 57 38 | 192 331 | 1587 2961 22 60 40 | 651 1180 | 7657 14744 | 23 63 42 | 20703899 | 36291 71207 24 66 44 | 7290 14052 | 180444 357308 25 69 46 | 25381 49667 | 898310 1787611 26 72 48 | 91441 180502 | 4532719 9042238 27 75 50 | 329824 654674 | 22949165 4583960128 78 52 | 1204737 2398527 | 116805726 233457359 29 81 54 8800984 1192066180 30 84 56 | 16248772 3244708 | 305266452 610436644 31 87 58 | 59995535 119883207 | 1567197926 31331752928 60 | 222231424444226539〈8059175752 161176530535〈33 93 62〈82508656 1649550311〈415411427833 8308049285994〈34 96 64〈3069993552 6138874486〈21453967091 42907478254〈35 99 99 66〈11446245342 22890091062〈1110006060777年199999305869〈36 102 68〈〈4275860876151947468;2145396707091 429074777年19999999305869〈36 102 68〈42758608761511947468 42537468〈2145393936060777219999999305869〈36 102 68〈 37 105 70 |16001226334 32003030067 | 38 108 72 | 599822851579 1199620598580 | 39 111 74 | 225137171764 4504219709753 | 40 114 76 | 8469193859271 16938267502048 | 由于未知原因,此表的先前版本的nv=29值8800984不正确 。程序似乎总能得到正确的答案0 10 16 8 | 1 1 1 | 1 1 | 12 20 10 | 3 4 | 13 22 11 | 3 3 14 24 12 | 11 15 15 26 13 | 18 25 | 16 28 14 | 58 92 17 30 15 |139 234 18 32 16 | 451 803 d 19 34 17 | 1326 2469 20 36 18 | 21 38 19ウ14554 28290 | 22 40 20 | 49957 98148 23 42 21 | 171159 338673 24 44 22 | 598102 1188338 2546 23 | 2098675 4180854 | 26 48 24 | 7437910 14840031 27 50 25 | 2649072 52904562 | 94944685 189724510 29 54 27 | 341867921 683384218 | 1236864842 247261423 | 31 58 29 | 4493270976 8984888982 | 32 60 30 | 16387785286332772085447 33 62 31 | 59985464681 119963084542 34 64 32 | 220320405895 4406235586740 35 66 33 | 811796327750 1623555117611 36 68 34 | 3000183106119 60002835550482 (在此表的前一版本中,nv=31的两个值互换。感谢Hugo Pfoertner的注意。)。在这里,我们将仅列出最近版本的功能所做的更改。内部更改列于plantri.c. 版本3.0: 于2000年4月25日发布。 版本3.1: 发布于7月3日,我们认为,只有在附录中所列的任何一个错误都不能正确地计算出这些错误26个或更多顶点的程序。使用-m4、-c4、-b和min5插件的正确操作没有受到影响。 版本3.1在不改变程序行为的情况下更正了错误。非常感谢Thom的帮助。 版本4.0: 于2001年4月20日发布。 为3连接四边形添加了-q。 为一般平面图添加了-pc1和-pc2。 添加了-m5和变体。不再需要插件min5.c。 sparse6输出现在只表示一次循环。 版本4.1: 于2001年11月30日发布。 添加了-qc2、-qc4、-qm2c2,用于四元调节类型。 版本4.3: 于2007年8月5日发布。 添加了-V:只写具有非平凡组的组 添加了-E:以边缘代码写入输出 添加了-bp:一般二部图 -p现在可以生成2个或3个顶点的图 -p版本4.4: 于2009年5月2日发布。 修复了-p和-pb中不正确的连接计算, 只有-c1x、-c2x和统计数据的问题是-v报告的4.5版: 于9月5日发布,2011. 还将FAST FILTER_x应用于起始图形(所有使用都需要对照代码进行检查,因为可能需要定义多个筛选器)