İki taraflı mı?


13

İki taraflı bir grafik, köşeleri aynı kümedeki iki köşeyi birbirine bağlamayacak şekilde, iki ayrık kümeye bölünebilen bir grafiktir. Bir grafik iki taraflıysa ve yalnızca 2 renklendirilebilirse.


Meydan okuma

Göreviniz, yönlendirilmemiş basit bir grafiğin bitişiklik matrisi göz önüne alındığında, bunun iki taraflı bir grafik olup olmadığını belirlemektir. Bir kenar i ve j köşelerini birbirine bağlarsa, matrisin hem (i, j) hem de (j, i) girişi 1'dir.

Grafik yönlendirilmemiş ve basit olduğundan, bitişiklik matrisi simetriktir ve sadece 0 ve 1 içerir.

Ayrıntılı Bilgiler

Giriş olarak bir N-N-matrisi almalısınız (herhangi bir biçimde, örneğin liste listesi, dizelerin listesi, C-benzeri int**ve boyut, düzleştirilmiş dizi, ham giriş, vb.).

Grafik iki taraflı ise işlev / program doğruluk değeri döndürmeli / çıktı sağlamalı, aksi halde yanlış olmalıdır.

Test Durumları

['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

puanlama

Cevabı doğrudan hesaplayan yapı yasaklandı.

Bu , bu nedenle bu ayın sonuna kadar en kısa program (bayt cinsinden) kazanır!


İlişkili ve aslında sınırda dupe, çünkü bipartit olmak tek bir döngüye sahip olmakla eşdeğerdir ve bu soruya verilen cevapların çoğu tüm döngüleri numaralandırarak ve uzunluklarını inceleyerek çalışır.
Peter Taylor

@PeterTaylor Evet, ancak bu sorunu çözmenin daha basit yolları var.
Colera Su

@ColeraSu Doğruluk / falsili yerine, doğruluk -1için negatif ve negatif olmayan bir tamsayı için geri dönebilir miyiz?
Bay Xcoder

@MishaLavrov 0-> Falsy, >0-> Truthy'a genellikle standart doğruluk / falsy kuralları ile izin verilir. -1ve ≥ 0o kadar yaygın değil, bu yüzden sordum.
Bay Xcoder

@ Mr.Xcoder Sorun değil.
Colera Su

Yanıtlar:


4

Kabuk , 17 bayt

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

Grafik iki taraflıysa, pozitif bir tam sayı yazdırır 0. Çevrimiçi deneyin!

açıklama

Bu kaba bir kuvvet yaklaşımıdır: köşelerin tüm alt kümeleri S'yi yineleyin ve grafikteki tüm kenarların S ile tamamlayıcısı arasında olup olmadığını görün .

§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 Peki, varsayalım M = [[1,2,3],[4,5,6],[7,8,9]]ve S = [1,0,1]( Mher zaman programda ikili bir matristir, ancak bu şekilde açıklamak daha kolaydır) Her satır filtre Mile Sverir [[1,3],[4,6],[7,9]]: burada her satır için, O endekslerine elementler çıkartılır ve Sbir 0 değerini alır Sonra negate Söğeye elde etmek için [0,1,0], ve filtre Mbu almak için [[4,6]]: İlk ve son satır gelen indeksleri 0 var , böylece kaldırılır.
Zgarb

17

Wolfram Dili (Mathematica) , 26 25 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

Bir komşuluk matrisi bir göz önüne alındığında, B = A ile başlayan ve daha sonra bir ile B yerine sabit noktasını bulmak 2 arada 1'e k 1'den büyük değerler kırpma, B inci bu işlemin aşama eşdeğer kadar Clipgüçleri bulma bir 2k + 1 (i, j) giriş j tepe i uzunluğu, 2k + 1 yollarının sayısını sayan ettiği; bu nedenle sabit nokta, tek bir adımda i'den j'ye gidebileceğimiz sıfır olmayan (i, j) girişe sahip olur.

Özellikle, sabit noktanın köşegeninde sıfır olmayan girişler vardır ancak bir tepe noktası tek sayıda adımda kendisine erişebiliyorsa: tek bir döngü varsa. Dolayısıyla, sabit noktanın izi sadece ve eğer grafik iki taraflı ise 0'dır.

Bu formun 25 baytlık bir başka çözümü Tr[#O@n//.x_:>#.#.x]===0&, bayt sayısının daha da aşağıya nasıl itileceği hakkında fikir vermesi durumundadır.

Önceki çabalar

Buna cevap vermeden önce bu cevaba bir dizi yaklaşım denedim.

26 bayt: matris üstelleri

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

Ayrıca bitişiklik matrisinin garip güçlerine de dayanır. X * exp yana (x 2 ) x + x 3 + x 5 /2! + x 7/4 ! + ..., x bir A matrisi olduğunda, bu A'nın her tek gücü için pozitif bir terime sahiptir, bu nedenle A'nın tek bir döngüye sahip olması durumunda sıfır iz de olacaktır. Bu çözüm büyük matrisler için çok yavaştır.

29 bayt: büyük garip güç

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

N'den n'ye A matrisi için A 2n + 1'i bulur ve sonra diyagonal kontrolü yapar. Burada, #~Table~Tr[2#!]2n, girdi matris tarafından n kopyalarını ve üretir #.##& @@ {a,b,c,d}için açar a.a.b.c.dbirlikte bir sonucu olarak matris 2n + 1 kopya çarpılması.

53 bayt: Laplacian matrisi

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

Spektral grafik teorisinde belirsiz bir sonuç kullanır ( Bu pdf'de Önerme 1.3.10 ).


Bence daha verimli yönteminizle birkaç bayt tıraş edebilirsiniz Tr[#.Nest[#.#&,#,Tr[#!]]]<1&. (Bu her baktığımda iyileşmeye devam eden inanılmaz bir cevap!)
bir ağaç değil

1
Bu, yarı yerleşik (iki işleve ihtiyaç duyar) daha az bayt içerirBipartiteGraphQ@AdjacencyGraph@#&
Kelly Lowder

2
@KellyLowder: Büyük matrisler için , eklendiğinde otomatik olarak basitleştirilmeyen MatrixExpdeğerlendirilmemiş Rootnesneler açısından sonuç döndürür . N@Bu kuvvetler, Rootsayısal olarak çok truthiness daha sonra değerlendirilebilmesi için hesaplanacak.
Michael Seifert

1
@Notatree Yaklaşımınız gerçekten de birkaç bayt tüketiyor, ancak maliyeti; 18x18 matrisler için 1000 kat daha yavaştır ve oradan daha da kötüleşir. Bence bu değişikliği yaparsam, etkin yöntemi "verimli" olarak adlandırma hakkımı kaybederim.
Misha Lavrov

1
@KellyLowder Bunu kısaltabilirsiniz BipartiteGraphQ@*AdjacencyGraph, ama yine de daha uzun.
Martin Ender

3

JavaScript, 78 bayt

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

0/1 dizisinin girdi dizisini girin, true / false çıktısını alın.


2

Pyth , 25 bayt

xmyss.D.DRx0dQx1d.nM*FQss

Çevrimiçi deneyin!

Bu -1, falsy ve doğruluk için negatif olmayan bir tam sayı için geri döner.

Nasıl çalışır

xmyss.D.DRx0dQx1d.nM * FQss ~ Tam program, STDIN'den bir bitişiklik matrisi alır.

                    * FQ ~ Kartezyen ürün ile azaltılır (katlanır).
                 .nM ~ Her birini düzleştirin.
 m ~ Değişken ile harita d.
         RQ ~ Girişteki her eleman için,
       .D ~ Dizinlerdeki öğeleri silme ...
          x0d ~ d cinsinden 0 cinsinden tüm dizinler.
     .D ~ Ve bu listeden dizinlerdeki öğeleri silin ...
              x1d ~ d cinsinden 1'in tüm dizinleri.
    s ~ Düzleştirin.
   s ~ Toplam. [] Görünmezse s'yi kullanabilirdim.
  y ~ Çift.
x ~ Yukarıdaki eşlemede, ...
                       ss ~ Giriş matrisindeki toplam 1 sayısı.

Bu TiO'nun mevcut Pyth versiyonu olan d315e19'da çalışır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.