是二人的吗?


13

二分图是其顶点可分为两个不相交的集合,使得没有边缘在同一组连接两个顶点的曲线图。当且仅当图是2色时,图才是二部图。


挑战

给定一个无向简单图的邻接矩阵,您的任务是确定它是否是二部图。也就是说,如果一条边连接顶点i和j,则矩阵的(i,j)和(j,i)项均为1。

由于图是无向且简单的,因此其邻接矩阵是对称的,并且仅包含0和1。

细节

您应该采用N×N矩阵作为输入(任何形式,例如列表列表,字符串列表,类似C的字符串int**和大小,展平的数组,原始输入等)。

如果该图是二部图的,则函数/程序应返回/输出真实值,否则返回falsy。

测试用例

['00101',
 '00010',
 '10001',
 '01000',
 '10100'] : False
['010100',
 '100011',
 '000100',
 '101000',
 '010000',
 '010000'] : True (divide into {0, 2, 4, 5} and {1, 3})
['00',
 '00'] : True

计分

禁止直接计算答案的内建函数。

这是,因此,本月底之前最短的程序(以字节为单位)将获胜!


相关的,实际上是边缘重复的,因为被二等分就等于没有奇数个循环,该问题的大多数答案都是通过枚举所有循环并检查其长度来实现的。
彼得·泰勒

@PeterTaylor是的,但是有解决此问题的更简单方法。
Colera Su

@ColeraSu除了真假/虚假,我们还能返回-1真假和任何非负整数作为真假吗?
Xcoder先生

@MishaLavrov- 0> 虚假,>0->真实/虚假规则通常允许Truthy。-1≥ 0不是常见的,这就是为什么我问。
Xcoder先生

@ Mr.Xcoder没关系。
Colera Su

Answers:


4

外壳,17个字节

§V¤=ṁΣṠMSȯDfm¬ṀfΠ

如果该图是二分图,0则输出一个正整数,否则。 在线尝试!

说明

这是一种蛮力方法:迭代顶点的所有子集S,并查看图中的所有边是否在S及其补码之间。

§V¤=ṁΣṠMSȯDfm¬ṀfΠ  Implicit input: binary matrix M.
                Π  Cartesian product; result is X.
                   Elements of X are binary lists representing subsets of vertices.
                   If M contains an all-0 row, the corresponding vertex is never chosen,
                   but it is irrelevant anyway, since it has no neighbors.
                   All-1 rows do not occur, as the graph is simple.
      ṠM           For each list S in X:
              Ṁf   Filter each row of M by S, keeping the bits at the truthy indices of S,
        S  fm¬     then filter the result by the element-wise negation of S,
         ȯD        and concatenate the resulting matrix to itself.
                   Now we have, for each subset S, a matrix containing the edges
                   from S to its complement, twice.
§V                 1-based index of the first matrix
  ¤=               that equals M
    ṁΣ             by the sum of all rows, i.e. total number of 1s.
                   Implicitly print.

@ Mr.Xcoder好吧,假设M = [[1,2,3],[4,5,6],[7,8,9]]and S = [1,0,1]M在程序中始终是一个二进制矩阵,但是用这种方式解释起来更容易)。过滤Mby的每一行会S给出[[1,3],[4,6],[7,9]]:对于每一行,我删除那些索引处的元素,其中索引S为0。然后我按S元素取反get [0,1,0],然后M按该元素进行过滤,以得到[[4,6]]:第一行和最后一行在相应索引中为0 ,因此将其删除。
Zgarb

17

Wolfram语言(Mathematica)26 25字节

Tr[#//.x_:>#.#.Clip@x]<1&

在线尝试!

怎么运行的

给定一个邻接矩阵A,我们找到从B = A开始然后用A 2 B 替换B的固定点,偶尔将大于1的值裁剪为1。此过程的第k 步骤等效于Clip求幂甲2K + 1,其中,第(i,j)的条目计数的从顶点i到j长度2K + 1的路径的数量; 因此,如果我们可以以奇数步数从i转到j,则固定点最终将具有非零(i,j)条目。

特别是,仅当顶点可以奇数步到达自身时,固定点的对角线才具有非零项:如果存在奇数周期。因此,当且仅当图为二部图时,固定点的迹线才为0。

这种形式的另一个25字节解决方案是Tr[#O@n//.x_:>#.#.x]===0&,以防万一这给任何人提供了有关如何将字节数推得更低的想法。

先前的努力

在解决这个问题之前,我尝试了多种方法来解决这个问题。

26个字节:矩阵指数

N@Tr[#.MatrixExp[#.#]]==0&

还依赖于邻接矩阵的奇数幂。因为x * exp(x 2)是x + x 3 + x 5/2!+ x 7/4!+ ...,当x是矩阵A时,它对A的每个奇数幂都有一个正项,所以当A具有奇数周期时,它的轨迹也将为零。对于大型矩阵,此解决方案非常慢。

29个字节:大奇功率

Tr[#.##&@@#~Table~Tr[2#!]]<1&

对于n×n矩阵A,找到A 2n + 1,然后进行对角线检查。在此,#~Table~Tr[2#!]生成n x n个输入矩阵的2n份副本,并将其#.##& @@ {a,b,c,d}解压缩为a.a.b.c.d,从而将2n + 1份矩阵相乘。

53字节:拉普拉斯矩阵

(e=Eigenvalues)[(d=DiagonalMatrix[Tr/@#])+#]==e[d-#]&

在光谱图理论中使用模糊的结果(本pdf中的命题1.3.10)。


我认为您可以使用来将更有效的方法削减几个字节Tr[#.Nest[#.#&,#,Tr[#!]]]<1&。(这是一个令人难以置信的答案,每次我看到它都会变得越来越好!)
不是一棵树

1
该字节数少于半内置字节数(需要两个功能)BipartiteGraphQ@AdjacencyGraph@#&
Kelly Lowder

2
@KellyLowder:对于大型矩阵,MatrixExp返回的结果Root是未评估的对象,添加后不会自动简化。将N@这些Roots 强制数字化计算,以便随后评估真实性。
Michael Seifert

1
@Notatree您的方法的确确实节省了一些字节,但是却要花很多钱。对于18x18矩阵,速度要慢1000倍,并且从那里开始变得更糟。我认为,如果做出更改,我将失去将有效方法称为“有效”的权利。
Misha Lavrov

1
@KellyLowder您可以将其缩短为BipartiteGraphQ@*AdjacencyGraph,但还要更长。
马丁·恩德

3

JavaScript,78个字节

m=>!m.some((l,i)=>m.some((_,s)=>(l=m.map(t=>t.some((c,o)=>c&&l[o])))[i]&&s%2))

输入数组的数组为0/1,输出为true / false。


2

Pyth,25个字节

xmyss.D.DRx0dQx1d.nM*FQss

在线尝试!

这将返回-1falsy,任何非负整数将返回true。

怎么运行的

xmyss.D.DRx0dQx1d.nM * FQss〜完整程序,从STDIN接收邻接矩阵。

                    * FQ〜通过笛卡尔乘积减少(折叠)。
                 .nM〜拼合每个。
 m〜映射一个变量d。
         RQ〜对于输入中的每个元素,
       .D〜删除索引中的元素...
          x0d〜d中所有索引为0。
     .D〜然后从该列表中删除索引中的元素...
              x1d〜d中所有索引为1。
    s〜展平。
   s〜总和。如果[]不出现,我本可以使用s。
  y〜Double。
x〜在上面的映射中,获得...的第一个索引
                       ss〜输入矩阵中1的总数。

这在提交d315e19中有效,当前的Pyth版本TiO具有。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.