代数图-0.7:代数图构造和转换库
版权(c) 安德烈·莫霍夫2016-2022
许可证MIT(请参阅文件LICENSE)
维护人员andrey.mokhov@gmail.com
稳定性实验的
安全哈斯克尔
语言哈斯克尔2010

代数。图表。二分体。相邻地图。算法

描述

阿尔加是用于图的代数构造和操作的库在哈斯克尔。请参见这篇论文对于图书馆背后的动机、基础理论和实施细节。

本模块提供了关于无向二部图的几个基本算法。

简介

两党制测试

类型 奇数周期a=[a]来源 #

奇数长度的循环。例如,[1,2,3]表示循环1 -> 2 -> -> 1.

检测部件::订单a=>相邻地图a->要么(奇数周期a)(相邻地图a a)来源 #

测试给定对象的两党性代数。图表。相邻地图.如果成功,返回相邻地图具有相同的边集和每个顶点标记有它所属的部件。如果出现故障,请返回图中的奇数长度。

返回的分区在字典中是最小的,假设顶点左部分的顶点位于右部分的所有顶点之前。

返回的循环在以下意义上是最优的:存在一条路径它为空或结束于中第一个顶点相邻的顶点循环,以便路径 ++ 周期是不同的,并且路径 ++ 周期在所有这些成对的路径和循环。

注释:自相邻地图代表无方向的二部图,全部输入图中的边被视为无向的。请参阅示例和澄清的正确性属性。

复杂性:O((n+m)*log(n))时间和O(n+m)内存。

检测部件空的==右侧空的检测部件(顶点x) ==右侧(left顶点x)检测部件(边缘x x)==左[x]检测部件(边缘1 2)==右侧(边缘1 2)检测部件(1*(2+3))==右侧(边缘[(1,2), (1,3)])detectParts(1*2*3)==左[1,2,3]detectParts((1+3)*(2+4)+6*5)==右侧(互换(1 + 3) * (2 + 4) +互换5 * 6)检测部件((1*3*4)+2*(1+2))==左[2]检测部件(集团[1..10])==左[1,2,3]检测部件(电路[1..10])==右(电路[(x,x+1)| x<-[1,3,5,7,9]])检测部件(电路[1..11])==左[1.11]检测部件(二液化[]xs)==右(顶点xs[])检测部件(二液化(地图左(x:xs))(地图右侧ys)==右侧(二液化(地图左(x:xs))(地图右侧ys))是正确的(检测部件(明星x年)==非Elemx年是正确的(检测部件(来自二分体(至二分体x) )==真

的正确性检测部件可以用以下属性表示:

让无向=对称闭合输入case detect零件输入左循环->国防部(长度周期)2==1&&是SubgraphOf(电路循环)无向正确的结果->gmap(gmap) 来自任一(来自二分体结果)==无方向

匹配

数据 匹配a b类来源 #

A类匹配是两部分之间的一组成对非相邻边二部图的。

这个显示实例是使用匹配函数,带边以左顶点的升序列出。

显示(匹配[])==“匹配[]”显示(匹配[(2,‘a’),(1,‘b’)])==“匹配[(1,'b'),(2,'a')]”

实例

实例详细信息
(等式a、,等式b) =>等式(匹配a b) 来源 # 
实例详细信息

定义于代数。图表。二分体。相邻地图。算法

方法

(==)::匹配a b->匹配a b->布尔 #

(/=)::匹配a b->匹配a b->布尔 #

(订单a、,订单b) =>订单(匹配a b) 来源 # 
实例详细信息

定义于代数。图表。二分体。相邻地图。算法

(显示a、,显示b) =>显示(匹配a b) 来源 # 
实例详细信息

定义于代数。图表。二分体。相邻地图。算法

通用(匹配a b) 来源 # 
实例详细信息

定义于代数。图表。二分体。相邻地图。算法

关联的类型

类型 代表(匹配a b):类型->类型 #

方法

::匹配a b->代表(匹配a b)x#

::代表(匹配a b)x->匹配a b类#

类型 代表(匹配a b) 来源 # 
实例详细信息

定义于代数。图表。二分体。相邻地图。算法

类型 代表(匹配a b)=第1页('元数据“匹配”“代数.图.二部.邻接图.算法”“代数-图-0.7-DxCmXygYU3a8wvsz565Q5f”False(错误)) (C1类('MetaCons公司“匹配”前缀I'真的) (S1(第一阶段)('MetaSel(元选择)('只是“pairOfLeft”)'无源未打包'无源严格性'决定懒惰) (0级可采收水平(地图a b)):*: S1(第一阶段)('MetaSel(元选择)('只是“pairOfRight”)'无源未打包'无源严格性'决定懒惰) (0级可采收水平(地图b a))

左对齐::匹配a b->地图a b类来源 #

左侧部分中的匹配覆盖的顶点映射到其右边的邻居。复杂性:O(1)时间。

左对齐(匹配[])==地图。空的左对齐(匹配[(2,'a'),(1,'b')])==地图。来自列表[(1,'b'),(2,'a')]地图。大小.pairOfLeft==映射。大小.pairOfRight(右对齐)

对右对齐::匹配a b->地图b和a来源 #

右侧匹配覆盖的顶点映射到左边的邻居。复杂性:O(1).

对右对齐(匹配[])==地图。空的对右对齐(匹配[(2,'a'),(1,'b')])==地图。来自列表[('a',2),('b',1)]地图。大小.pairOfRight==映射。大小左侧的.pairOf

匹配:: (订单a、,订单b) =>[(a,b)]->匹配a b类来源 #

构造一个匹配从边列表中选择。复杂性:O(L*log(L))时间,其中L(左)是给定列表的长度。

显示在列表末尾附近的边将取代之前的所有边。也就是说,如果列表中的两条边共享一个顶点,则显示该顶点更接近开头的部分被忽略。

左对齐(匹配[])==映射。空的
对右对齐(匹配[])==映射。空的
左对齐(匹配[(2,'a'),(1,'b')])==地图。来自列表[(2,'a'),(1,'b')]左对齐(匹配[(1,'a'),(1,bb')])==地图。单子1“b”匹配[(1,‘a’),(1,'b'),(2,‘b’)

是匹配的:: (订单a、,订单b) =>匹配a b->相邻地图a b->布尔 来源 #

检查给定的匹配是有效的匹配二部图的。复杂性:O(S*log(n)),其中S公司是匹配的大小。

是匹配的(匹配[])x==真是匹配的(匹配X轴)空的==无效的X轴是否匹配(匹配[(x,y)])(边缘x y)==真是匹配的(匹配[(1,2)]) (边缘2 1)==错误

匹配大小::匹配a b->国际 来源 #

匹配中的边数。复杂性:O(1)时间。

匹配大小(匹配[])                 == 0匹配大小(匹配[(2,'a'),(1,'b')])==2匹配大小(匹配[(1,'a'),(1,b')])==1匹配大小(匹配X轴)<=长度X轴matchingSize==地图。大小.左对齐

maxMatching(最大匹配):: (订单a、,订单b) =>相邻地图a b->匹配a b类来源 #

查找最大匹配在二分图中。匹配是最大值,如果具有最大的可能大小。复杂性:O(m*sqrt(n)*log(n))时间。

maxMatching(最大匹配)空的==匹配[]maxMatching(最大匹配)(顶点xs-ys)==匹配[]maxMatching(最大匹配)(路径[1,2,3,4])                               ==匹配[(1,2), (3,4)]匹配大小(最大匹配(电路[(1,2), (3,4), (5,6)])) == 3匹配大小(最大匹配(明星x(y:ys))==1匹配大小(最大匹配(二液化xs-ys))==最小值(长度(节点xs))(长度(节点年)是匹配的(maxMatching x)x==真

顶点覆盖

类型 顶点覆盖a b=(设置a、,设置b)来源 #

A类顶点覆盖二部图的。

A类顶点覆盖是顶点的子集,因此每条边都与子集中的某个顶点。我们通过存储两组顶点,每个部分一个。等效表示法,稍微内存效率较低设置 (两者之一 b).

是顶点覆盖:: (订单a、,订单b) =>(设置a、,设置b) ->相邻地图a b->布尔 来源 #

检查给定的一对集合是否为顶点覆盖二部图的。复杂性:O(m*log(n)).

是顶点覆盖(xs,ys)空的==设置。无效的xs&&设置。无效的是顶点覆盖(xs,ys)(left顶点x) ==设置。是子集xs(集合。单子x) 设置(&&S)。无效的isVertexCoverOf(集合。空的,设置。空的) (边缘x y)==错误isVertexCoverOf(集合。单子x、 年)(边缘x y)==设置。是子集y(设置。单子年)isVertexOverOf(xs,集合。单子y)(边缘x y)==设置。是子集xs(集合。单子x)

顶点覆盖大小::顶点覆盖a b->国际 来源 #

顶点覆盖中的顶点数。复杂性:O(1)时间。

最小顶点覆盖:: (订单a、,订单b) =>相邻地图a b->顶点覆盖a b类来源 #

查找最小顶点覆盖在二分图中。顶点覆盖是最小值,如果它的大小尽可能小。复杂性:O(m*sqrt(n)*log(n)).

最小顶点覆盖空的==(设置。空的,设置。空的)最小顶点覆盖(顶点xs-ys)==(设置。空的,设置。空的)最小顶点覆盖(路径[1,2,3])==(设置。空的,设置。单子2)最小顶点覆盖(明星x(1:2:ys))==(设置。单子x、 设置。空的)顶点覆盖大小(最小顶点覆盖(二液化xs-ys))==最小值(长度(节点xs))(长度(节点年)顶点覆盖大小.min顶点覆盖==匹配大小.maxMatching(最大匹配)
是顶点覆盖(最小顶点覆盖x)x==真

独立的集合

类型 独立设置a b=(设置a、,设置b)来源 #

独立集二部图的。

独立集是顶点的子集,因此没有两个是相邻。我们通过存储两组顶点来表示独立集,其中一组是对于每个零件。一种等效表示,它的内存稍少高效,是设置 (两者之一 b).

独立设置为:: (订单a、,订单b) =>(设置a、,设置b) ->相邻地图a b->布尔 来源 #

检查给定的一对集合是否是独立集二部图的。复杂性:O(m*log(n)).

独立设置(xs,ys)空的==设置。无效的xs&&设置。无效的独立设置(xs,ys)(left顶点x) ==设置。是子集xs(集合。单子x) 设置(&&S)。无效的isIndependentSetOf(集合。空的,设置。空的) (边缘x y)==真isIndependentSetOf(集合。单子x、 年)(边缘x y)==设置。无效的isIndependentSetOf(xs,集合)。单子年)(边缘x y)==设置。无效的X轴

独立集大小::独立集a b->国际 来源 #

独立集中的顶点数。复杂性:O(1)时间。

最大独立集:: (订单a、,订单b) =>相邻地图a b->独立设置a b类来源 #

查找最大独立集在二分图中。一个独立的集合如果它具有最大的可能大小,则为最大。复杂性:O(m*sqrt(n)*log(n)).

最大独立集空的==(设置。空的,设置。空的)最大独立集(顶点xs-ys)==(设置。来自列表xs,集合。来自列表年)最大独立集(路径[1,2,3])==(设置。来自列表[1,3],设置。空的)最大独立集(明星x(1:2:ys))==(设置。空的,设置。来自列表(1:2:ys)独立集大小(最大独立集(二液化xs-ys))==最大值(长度(节点xs))(长度(节点年)独立集大小(最大独立集x)==顶点计数x个-顶点覆盖大小(最小顶点覆盖x)独立设置为(maxIndependentSet x)x=真

其他

增强路径:: (订单a、,订单b) =>匹配a b->相邻地图a b->要么(顶点覆盖a b)(列表a b)来源 #

给定二部图中的匹配,找到顶点覆盖相同尺寸或增强路径关于匹配,因此证明匹配不是最大值。复杂性:O((m+n)*log(n)).

交替路径是其边缘交替属于匹配而不是匹配。增强路径是交替路径从未被覆盖的顶点开始并在其上结束匹配。匹配是最大的当且仅当没有增广路径时关于它。

增强路径(匹配[])空的==左侧(设置。空的,设置。空的)增强路径(匹配[])      (边缘1 2)==右[1,2]增强路径(匹配[(1,2)]) (路径[1,2,3])==左侧(设置。空的,设置。单子2)增强路径(匹配[(3,2)]) (路径[1,2,3,4])==右[1,2,3.4]向左(增强路径(maxMatching(最大匹配)x) x)==正确

一致匹配:: (订单a、,订单b) =>匹配a b->布尔 来源 #

检查匹配的内部表示是否一致,即中存在的每个边缘左对齐也存在于对右对齐.复杂性:O(S*log(S)),其中S公司是匹配的大小。

一致匹配(匹配xs)==正确一致匹配(maxMatching(最大匹配)x) ==正确