Có phải là lưỡng cực?


13

Một đồ thị hai phía là một đồ thị có các đỉnh có thể được chia thành hai bộ rời nhau, chẳng hạn mà không có cạnh nối hai đỉnh trong cùng một tập. Một đồ thị là lưỡng cực khi và chỉ khi nó có 2 màu.


Thử thách

Nhiệm vụ của bạn là, đưa ra ma trận kề của một đồ thị đơn giản không xác định, xác định xem đó có phải là đồ thị lưỡng cực hay không. Nghĩa là, nếu một cạnh kết nối các đỉnh i và j, cả hai mục nhập (i, j) và (j, i) của ma trận là 1.

Do đồ thị là vô hướng và đơn giản, ma trận kề của nó là đối xứng và chỉ chứa 0 và 1.

Cụ thể

Bạn nên lấy ma trận N-by-N làm đầu vào (dưới mọi hình thức, ví dụ như danh sách danh sách, danh sách chuỗi, giống như C int**và kích thước, mảng dẹt, đầu vào thô, v.v.).

Hàm / chương trình sẽ trả về / xuất ra một giá trị trung thực nếu đồ thị là lưỡng cực và giả mạo khác.

Các trường hợp thử nghiệm

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

Chấm điểm

Nội dung tính toán câu trả lời trực tiếp bị cấm.

Đây là , vì vậy chương trình ngắn nhất (tính bằng byte) vào cuối tháng này sẽ thắng!


Liên quan , và trên thực tế là dupe đường biên, bởi vì là lưỡng cực tương đương với việc không có chu kỳ kỳ lạ, và hầu hết các câu trả lời cho câu hỏi đó hoạt động bằng cách liệt kê tất cả các chu kỳ và kiểm tra độ dài của chúng.
Peter Taylor

@PeterTaylor Vâng, nhưng có nhiều cách đơn giản hơn để giải quyết vấn đề này.
Colera Su

@ColeraSu Thay vì sự thật / giả dối, chúng ta có thể trả lại -1cho sai và bất kỳ số nguyên không âm nào cho sự thật không?
Ông Xcoder

@MishaLavrov 0-> Falsy, >0-> Sự thật thường được cho phép bởi các quy tắc trung thực / giả dối tiêu chuẩn. -1≥ 0nó không phổ biến, đó là lý do tại sao tôi hỏi.
Ông Xcoder

@ Mr.Xcoder Không sao đâu.
Colera Su

Câu trả lời:


4

Husk , 17 byte

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

In một số nguyên dương nếu đồ thị là lưỡng cực, 0nếu không. Hãy thử trực tuyến!

Giải trình

Đây là một cách tiếp cận mạnh mẽ: lặp qua tất cả các tập con S của các đỉnh và xem liệu tất cả các cạnh trong biểu đồ có nằm giữa S và phần bù của nó không.

§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 Vâng, giả sử M = [[1,2,3],[4,5,6],[7,8,9]]S = [1,0,1]( Mluôn là một ma trận nhị phân trong chương trình, nhưng nó dễ giải thích theo cách này hơn). Lọc từng hàng Mbằng cách Scho [[1,3],[4,6],[7,9]]: đối với mỗi hàng, tôi loại bỏ các phần tử tại các chỉ số Scó 0. Sau đó tôi phủ định Sphần tử khôn ngoan để nhận [0,1,0]và lọc Mtheo đó để nhận [[4,6]]: hàng đầu tiên và hàng cuối có 0 trong các chỉ mục tương ứng , vì vậy chúng được gỡ bỏ.
Zgarb

17

Ngôn ngữ Wolfram (Mathicala) , 26 25 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Đưa ra ma trận kề A, chúng ta thấy điểm cố định bắt đầu bằng B = A và sau đó thay thế B bằng A 2 B, đôi khi cắt các giá trị lớn hơn 1 đến 1. Bước thứ k của quy trình này tương đương Clipvới việc tìm kiếm quyền hạn Một 2k + 1 , trong đó mục (i, j) đếm số đường dẫn có độ dài 2k + 1 từ đỉnh i đến j; do đó, điểm cố định kết thúc có một mục nhập khác (i, j) nếu chúng ta có thể đi từ i đến j trong một số bước lẻ.

Cụ thể, đường chéo của điểm cố định chỉ có các mục khác không khi một đỉnh có thể tự đạt tới một số bước lẻ: nếu có một chu kỳ lẻ. Vì vậy, dấu vết của điểm cố định là 0 khi và chỉ khi đồ thị là lưỡng cực.

Một giải pháp 25 byte khác của hình thức này là Tr[#O@n//.x_:>#.#.x]===0&, trong trường hợp điều này cung cấp cho bất kỳ ai ý tưởng về cách đẩy số byte thậm chí thấp hơn.

Những nỗ lực trước đây

Tôi đã thử một số cách tiếp cận cho câu trả lời này trước khi giải quyết vấn đề này.

26 byte: số mũ ma trận

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

Cũng dựa vào sức mạnh kỳ lạ của ma trận kề. Kể từ x * exp (x 2 ) là x + x 3 + x 5 /2! + x 7/4 ! + ..., khi x là ma trận A, điều này có một số hạng dương cho mọi lũy thừa lẻ của A, do đó, nó cũng sẽ không có dấu vết iff A có chu kỳ lẻ. Giải pháp này rất chậm đối với ma trận lớn.

29 byte: công suất lẻ lớn

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

Đối với một ma trận n theo n ma trận A, tìm A 2n + 1 và sau đó thực hiện kiểm tra đường chéo. Ở đây, #~Table~Tr[2#!]tạo ra 2n bản sao của n theo n ma trận đầu vào và #.##& @@ {a,b,c,d}giải nén thành a.a.b.c.d, nhân với nhau 2n + 1 bản sao của ma trận.

53 byte: Ma trận Laplacian

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

Sử dụng một kết quả tối nghĩa trong lý thuyết đồ thị phổ ( Dự luật 1.3.10 trong pdf này ).


Tôi nghĩ rằng bạn có thể loại bỏ một vài byte khỏi phương thức hiệu quả hơn với Tr[#.Nest[#.#&,#,Tr[#!]]]<1&. (Đây là một câu trả lời đáng kinh ngạc, cứ trở nên tốt hơn mỗi khi tôi nhìn vào nó!)
Không phải là một cái cây

1
Điều này có ít byte hơn mà tích hợp sẵn (cần hai chức năng)BipartiteGraphQ@AdjacencyGraph@#&
Kelly Lowder

2
@KellyLowder: đối với các ma trận lớn MatrixExptrả về kết quả về các Rootđối tượng không được đánh giá, không được tự động đơn giản hóa khi thêm vào. Các N@lực lượng này Rootphải được tính bằng số để có thể đánh giá tính trung thực.
Michael Seifert

1
@Notatree Cách tiếp cận của bạn thực sự đã loại bỏ một vài byte, nhưng chúng có giá; đối với ma trận 18x18, tốc độ chậm hơn 1000 lần và nó trở nên tồi tệ hơn từ đó. Tôi nghĩ rằng nếu tôi thực hiện thay đổi đó, tôi sẽ mất quyền gọi phương thức hiệu quả là "hiệu quả".
Misha Lavrov

1
@KellyLowder Bạn có thể rút ngắn điều đó BipartiteGraphQ@*AdjacencyGraph, nhưng nó vẫn dài hơn.
Martin Ender

3

JavaScript, 78 byte

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

Mảng đầu vào của mảng 0/1, đầu ra đúng / sai.


2

Bình thường , 25 byte

xmyss.D.DRx0dQx1d.nM*FQss

Hãy thử trực tuyến!

Điều này trả về -1cho sai, và bất kỳ số nguyên không âm nào cho sự thật.

Làm thế nào nó hoạt động

xmyss.D.DRx0dQx1d.nM * FQss ~ Chương trình đầy đủ, nhận ma trận kề từ STDIN.

                    * FQ ~ Giảm (gấp) bởi sản phẩm cartesian.
                 .nM ~ Làm phẳng mỗi.
 m ~ Bản đồ với một biến d.
         RQ ~ Đối với mỗi yếu tố trong đầu vào,
       .D ~ Xóa các thành phần tại các chỉ mục ...
          x0d ~ Tất cả các chỉ số 0 trong d.
     .D ~ Và từ danh sách này, xóa các thành phần tại các chỉ mục ...
              x1d ~ Tất cả các chỉ số của 1 trong d.
    s ~ Làm phẳng.
   s ~ Tổng. Tôi có thể đã sử dụng s nếu [] sẽ không xuất hiện.
  y ~ Đôi.
x ~ Trong ánh xạ trên, lấy chỉ mục đầu tiên của ...
                       ss ~ Tổng số 1 trong ma trận đầu vào.

Điều này hoạt động trong cam kết d315e19 , phiên bản Pyth hiện tại mà TiO có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.