มันคือสองฝ่าย?


13

ฝ่ายกราฟเป็นกราฟที่มีจุดสามารถแบ่งออกเป็นสองชุดเคลื่อนเช่นว่าขอบไม่เชื่อมต่อสองจุดอยู่ในชุดเดียวกัน กราฟเป็นสองฝ่ายถ้าหากมันเป็น 2 สี


ท้าทาย

งานของคุณคือการให้กราฟadjacencyของกราฟง่าย ๆ ไม่ได้บอกทิศทางว่าเป็นกราฟสองฝ่ายหรือไม่ นั่นคือถ้าขอบเชื่อมต่อจุดยอด i และ j ทั้งสองรายการ (i, j) และ (j, i) ของเมทริกซ์คือ 1

เนื่องจากกราฟนั้นไม่ได้บอกทิศทางและเรียบง่ายเมทริกซ์ adjacency จึงมีความสมมาตรและมีเพียง 0 และ 1

ข้อมูลจำเพาะ

คุณควรใช้เมทริกซ์ N-by-N เป็นอินพุต (ในรูปแบบใด ๆ เช่นรายการของรายการ, รายการสตริง, C-like int**และขนาด, อาร์เรย์ที่แบน, อินพุตดิบ ฯลฯ )

ฟังก์ชั่น / โปรแกรมควรกลับ / ส่งออกค่าความจริงถ้ากราฟเป็นสองฝ่ายและเป็นเท็จอย่างอื่น

กรณีทดสอบ

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

เกณฑ์การให้คะแนน

Builtins ที่คำนวณคำตอบโดยตรงถูกห้าม

นี่คือดังนั้นโปรแกรมที่สั้นที่สุด (เป็นไบต์) ในตอนท้ายของเดือนนี้จะเป็นผู้ชนะ!


ที่เกี่ยวข้องและในความเป็นจริงเขตแดนล่อเนื่องจากเป็นสองฝ่ายเทียบเท่ากับไม่มีรอบแปลกและคำตอบส่วนใหญ่ของคำถามที่ทำงานโดยการแจกแจงทุกรอบและตรวจสอบความยาวของพวกเขา
Peter Taylor

@ PeterTaylor ใช่ แต่มีวิธีที่ง่ายกว่าในการแก้ปัญหานี้
Colera Su

@ColeraSu แทนที่จะเป็นความจริง / เป็นเท็จเราสามารถกลับไป-1หาค่า falsy และจำนวนเต็มที่ไม่เป็นลบสำหรับความจริงได้ไหม?
Mr. Xcoder

@MishaLavrov 0-> Falsy, >0-> Truthy ได้รับอนุญาตโดยทั่วไปตามกฎความจริง / เท็จ -1และ≥ 0ไม่ธรรมดานั่นคือสาเหตุที่ฉันถาม
Mr. Xcoder

@ Mr.Xcoder ไม่เป็นไร
Colera Su

คำตอบ:


4

Husk , 17 ไบต์

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

พิมพ์จำนวนเต็มบวกถ้ากราฟเป็น bipartite 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]]และS = [1,0,1]( Mมักจะเป็นเมทริกซ์ไบนารีในโปรแกรม แต่มันง่ายที่จะอธิบายวิธีนี้) การกรองแต่ละแถวMด้วยการSให้[[1,3],[4,6],[7,9]]: สำหรับแต่ละแถวฉันลบองค์ประกอบที่ดัชนีเหล่านั้นที่Sมี 0 จากนั้นฉันคัดค้านSองค์ประกอบที่ฉลาดที่จะได้รับ[0,1,0]และกรองMตามที่จะได้รับ[[4,6]]: แถวแรกและแถวสุดท้ายมี 0 ในดัชนีที่สอดคล้องกัน ดังนั้นพวกเขาจะถูกลบออก
Zgarb

17

ภาษา Wolfram (Mathematica) , 26 25 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

รับถ้อยคำเมทริกซ์ A เราจะพบจุดคงที่ของการเริ่มต้นด้วย B = A และ B แล้วแทนที่โดย2 B, บางครั้งการตัดค่าขนาดใหญ่กว่า 1 ถึง 1 k THขั้นตอนของกระบวนการนี้จะขึ้นเทียบเท่ากับClipการหาอำนาจ A 2k + 1ซึ่งรายการ (i, j) นับจำนวนเส้นทางยาว 2k + 1 จากจุดยอด i ถึง j; ดังนั้นจุดคงที่จะสิ้นสุดลงโดยมีค่าไม่ใช่ศูนย์ (i, j) ถ้าเราสามารถไปจาก i ถึง j ในขั้นตอนจำนวนคี่

โดยเฉพาะอย่างยิ่งเส้นทแยงมุมของจุดคงที่มีรายการที่ไม่ใช่ศูนย์เฉพาะเมื่อจุดยอดสามารถเข้าถึงตัวเองในขั้นตอนจำนวนคี่: ถ้ามีวงจรคี่ ดังนั้นการติดตามจุดคงที่คือ 0 ถ้ากราฟเป็นสองฝ่ายเท่านั้น

อีกโซลูชัน 25 ไบต์ของแบบฟอร์มนี้คือTr[#O@n//.x_:>#.#.x]===0&ในกรณีที่ให้ความคิดกับทุกคนเกี่ยวกับวิธีการนับจำนวนไบต์ที่ต่ำลง

ความพยายามก่อนหน้า

ฉันได้ลองหลายวิธีในการตอบคำถามนี้ก่อนที่จะตัดสินใจ

26 ไบต์: เลขยกกำลังเมทริกซ์

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

นอกจากนี้ยังต้องอาศัยพลังแปลก ๆ ของเมทริกซ์ adjacency ตั้งแต่ x * exp (x 2 ) เป็น x + x 3 + x 5 /2! + x 7/4 ! + ... , เมื่อ x เป็นเมทริกซ์ A นี่จะมีศัพท์เชิงบวกสำหรับพลังแปลก ๆ ทุกอันของ A ดังนั้นมันจะมีค่าการติดตามเป็นศูนย์ถ้า if A มีรอบแปลก วิธีนี้ช้ามากสำหรับเมทริกซ์ขนาดใหญ่

29 ไบต์: พลังคี่ขนาดใหญ่

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

สำหรับ n โดย n matrix A ให้หา A 2n + 1แล้วทำการตรวจสอบในแนวทแยง ที่นี่#~Table~Tr[2#!]สร้างสำเนา 2n ของ n ด้วยเมทริกซ์อินพุท n และ#.##& @@ {a,b,c,d}คลายการa.a.b.c.dคูณด้วยเมทริกซ์ 2n + 1 สำเนาด้วยกัน

53 ไบต์: Laplacian matrix

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

ใช้ผลลัพธ์ที่ไม่ชัดเจนในทฤษฎีกราฟสเปกตรัม ( ข้อเสนอ 1.3.10 ในไฟล์ PDF นี้ )


Tr[#.Nest[#.#&,#,Tr[#!]]]<1&ฉันคิดว่าคุณสามารถโกนคู่ของไบต์ปิดวิธีที่มีประสิทธิภาพมากขึ้นของคุณด้วย (นี่เป็นคำตอบที่เหลือเชื่อที่ทำให้ดีขึ้นทุกครั้งที่ฉันมองมัน!)
ไม่ใช่ต้นไม้

1
นี่มีไบต์ที่น้อยกว่าที่มีในตัว (ต้องการฟังก์ชั่นสองอย่าง)BipartiteGraphQ@AdjacencyGraph@#&
Kelly Lowder

2
@KellyLowder: สำหรับเมทริกซ์ขนาดใหญ่MatrixExpจะให้ผลลัพธ์ในรูปของRootวัตถุที่ไม่ได้รับการประเมินซึ่งจะไม่ทำให้ง่ายขึ้นโดยอัตโนมัติเมื่อทำการเพิ่ม N@กองกำลังเหล่านี้Rootที่จะได้รับการคำนวณตัวเลขเพื่อให้ truthiness นั้นจะสามารถประเมิน
Michael Seifert

1
@Notatree วิธีการของคุณจะกำจัดออกไปสองสามไบต์ แต่มันมีค่าใช้จ่าย สำหรับ 18x18 เมทริกซ์มันช้ากว่า 1,000 เท่าและแย่ลงกว่าเดิม ฉันคิดว่าถ้าฉันทำการเปลี่ยนแปลงนั้นฉันจะสูญเสียสิทธิที่จะเรียกวิธีที่มีประสิทธิภาพ "มีประสิทธิภาพ"
Misha Lavrov

1
@ KellyLowder คุณสามารถย่อให้สั้นลงBipartiteGraphQ@*AdjacencyGraphแต่ก็ยังอีกต่อไป
Martin Ender

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, เอาต์พุตจริง / เท็จ


2

Pyth , 25 ไบต์

xmyss.D.DRx0dQx1d.nM*FQss

ลองออนไลน์!

สิ่งนี้จะส่งกลับค่า-1เท็จและจำนวนเต็มใด ๆ ที่ไม่เป็นลบสำหรับความจริง

มันทำงานอย่างไร

xmyss.D.DRx0dQx1d.nM * FQss ~ โปรแกรมเต็มรูปแบบได้รับเมทริกซ์ adjacency จาก STDIN

                    * FQ ~ ลด (เท่า) โดยผลิตภัณฑ์คาร์ทีเซียน
                 .nM ~ แผ่ให้แบนละ
 m ~ แผนที่พร้อมตัวแปร d
         RQ ~ สำหรับแต่ละองค์ประกอบในอินพุต
       .D ~ ลบองค์ประกอบที่ดัชนี ...
          x0d ~ ดัชนีทั้งหมดจาก 0 ในวันที่
     .D ~ และจากรายการนี้ลบองค์ประกอบที่ดัชนี ...
              x1d ~ ดัชนีทั้งหมด 1 ใน d
    s ~ แบน
   s ~ Sum ฉันน่าจะใช้ s ถ้า [] ไม่ปรากฏขึ้น
  y ~ สองเท่า
x ~ ในการทำแผนที่ด้านบนรับดัชนีแรกของ ...
                       ss ~ จำนวนทั้งหมดของ 1 ในอินพุตเมทริกซ์

ใช้งานได้กับd315e19ซึ่งเป็นเวอร์ชั่นปัจจุบันของPyth TiO

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.