DAG เป็นการลดสกรรมกริยาหรือไม่


11

เป้าหมายของการท้าทายนี้จะได้รับแน่นอนกำกับวัฏจักรกราฟ (DAG) ตรวจสอบว่ากราฟเป็นลดสกรรมกริยา

คำอธิบายสั้น ๆ เกี่ยวกับสิ่งที่ DAG และการลดลงของสกรรมกริยาคือ:

DAG เป็นกราฟที่มีขอบกำกับ (เช่นคุณสามารถเดินทางไปในทิศทางเดียวบนขอบนั้น) ซึ่งให้โหนดเริ่มต้นใด ๆ บนกราฟมันเป็นไปไม่ได้ที่จะกลับไปที่โหนดเริ่มต้น (เช่นไม่มีรอบ)

ให้โหนดเริ่มต้นใด ๆ หากเป็นไปได้ที่จะเดินทางไปยังโหนดสิ้นสุดอื่นในกราฟผ่านทางจำนวนบวกขอบโดยพลการจากนั้นโหนดปลายทางนั้นจะถูกกำหนดให้สามารถเข้าถึงได้จากโหนดเริ่มต้น ใน DAG ทั่วไปอาจมีหลายเส้นทางที่สามารถนำมาจากโหนดเริ่มต้นไปยังโหนดปลายทางที่สิ้นสุด ตัวอย่างเช่นใช้กราฟเพชรนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ที่จะได้รับไปยังโหนดDจากAคุณสามารถใช้เส้นทางหรือA->B->D A->C->Dดังนั้นจึงสามารถเข้าถึงได้จากD Aแต่มีเส้นทางที่สามารถนำที่จะได้รับไปยังโหนดไม่เริ่มต้นจากโหนดB Cดังนั้นโหนดไม่สามารถเข้าถึงได้จากโหนดBC

กำหนดความสามารถในการเข้าถึงของกราฟเป็นรายการของโหนดที่สามารถเข้าถึงได้สำหรับทุกโหนดเริ่มต้นในกราฟ ดังนั้นสำหรับกราฟเพชรตัวอย่างเดียวกันความสามารถในการเข้าถึงคือ:

A: [B, C, D]
B: [D]
C: [D]
D: []

กราฟอื่นที่มีความสามารถในการเข้าถึงเหมือนกับกราฟด้านบนแสดงอยู่ด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามกราฟที่สองนี้มีขอบมากกว่ากราฟต้นฉบับ การลดสกรรมกริยาของกราฟเป็นกราฟที่มีจำนวนน้อยที่สุดของขอบและความสามารถในการเข้าถึงของกราฟดั้งเดิม ดังนั้นกราฟแรกคือการลดลงของสกรรมกริยาที่สอง

สำหรับ DAG ที่ จำกัด การลดการส่งผ่านจะรับประกันว่ามีอยู่จริงและไม่ซ้ำกัน

อินพุต

อินพุตคือ "รายการของรายการ" โดยที่รายการภายนอกมีความยาวของจำนวนจุดยอดและแต่ละรายการภายในคือความยาวของจำนวนขอบที่ออกจากโหนดที่เกี่ยวข้องและมีดัชนีของโหนดปลายทาง ตัวอย่างเช่นวิธีหนึ่งในการอธิบายกราฟแรกข้างต้นคือ (สมมติว่ามีการทำดัชนีตามศูนย์):

[[1, 2], [3], [3], []]

คุณสามารถเริ่มสร้างดัชนีของโหนดแรกที่ค่าจำนวนเต็มใด ๆ (เช่นการจัดทำดัชนีตาม 0 หรือ 1)

อินพุตอาจมาจากแหล่งอินพุตที่ต้องการ (stdio, พารามิเตอร์ฟังก์ชัน ฯลฯ ) คุณมีอิสระที่จะเลือกรูปแบบการป้อนข้อมูลที่แน่นอนตราบใดที่ไม่มีการให้ข้อมูลเพิ่มเติม ตัวอย่างเช่นหากคุณต้องการรับอินพุตจาก stdio คุณสามารถให้แต่ละบรรทัดเป็นรายการขอบสำหรับโหนดที่เกี่ยวข้อง อดีต .:

1 2
3
3
'' (blank line)

ดัชนีในรายการถ้อยคำแต่ละคนจะไม่จำเป็นต้องเรียงและอาจจะมีการเชื่อมต่อหลายขอบสองโหนด (อดีต .: [[1,1],[]]) คุณอาจสมมติว่ากราฟอินพุตมีการเชื่อมต่ออย่างอ่อนและไม่มีรอบ (เช่น DAG)

เอาท์พุต

เอาท์พุทเป็นความจริงถ้าอินพุต DAG ที่กำหนดคือการลดสกรรมกริยาและค่าเท็จเป็นอย่างอื่น นี่อาจเป็นสิ่งที่ต้องการ (stdio, ค่าส่งคืน, พารามิเตอร์ขาออก, ฯลฯ )

ตัวอย่าง

ตัวอย่างทั้งหมดใช้การทำดัชนีแบบอิง 0

[[1,2],[3],[3],[]]
true

[[1,2,3],[3],[3],[]]
false

[[1,1],[]]
false

[[1,2,3,4],[5,6,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true

[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true

[[5,6,7],[2,3,0,4,14,5,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false

[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10,14],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false

[[1,3],[2],[3],[]]
false

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

นี่คือรหัสกอล์ฟ โค้ดที่น้อยที่สุดในหน่วยไบต์ชนะ รหัสของคุณควรเสร็จในเวลาที่เหมาะสม (สูงสุด 10 นาทีสำหรับฮาร์ดแวร์ใดก็ตามที่คุณมี) ช่องโหว่มาตรฐานใช้ คุณสามารถใช้บิวด์อินที่ต้องการได้


เราสามารถตั้งสมมติฐานเกี่ยวกับการเชื่อมต่อของอินพุตได้หรือไม่? (ฉันไม่ได้ตรวจสอบกรณีทดสอบทั้งหมดของคุณ แต่พวกเขาครอบคลุมส่วนที่ไม่ได้เชื่อมต่อหลายส่วนของกราฟหรือไม่)
Martin Ender

อัปเดตกับสิ่งที่ฉันเชื่อว่าเป็นภาษาที่ถูกต้อง
helloworld922

ฉันเดาว่าไม่เป็นไร นอกจากนี้คุณยังอาจกล่าวได้ว่ากราฟจะเชื่อมต่ออย่างอ่อน
Martin Ender

คำตอบ:


5

Ruby, 101 97 ไบต์

วิธีการง่ายๆที่คำนวณการเข้าถึงจากแต่ละโหนดและพิจารณาว่าสามารถเข้าถึงโหนดย่อยผ่านโหนดอื่น ๆ ได้หรือไม่ ดูเหมือนจะล้มเหลวในกราฟวงกลม แต่คำจำกัดความของ DAG บอกเป็นนัยว่าไม่ควรเป็นวงจรเลย

ลองออนไลน์!

->g{r=->i{i|i.map{|j|r[g[j]||[]]}.inject([],:|)}
g.all?{|e|e==e&e&&e.none?{|i|r[e-[i]].index i}}}

4

Mathematica, 95 82 ไบต์

13 ไบต์บันทึกไว้เนื่องจาก@MartinEnder

#~IsomorphicGraphQ~TransitiveReductionGraph@#&@Graph[x=0;##&@@Thread[++x->#]&/@#]&

ฟังก์ชั่นไม่ระบุชื่อ ใช้รายการที่ซ้อนกันเป็นอินพุต (อิง 1) และส่งคืนTrueหรือFalseเป็นเอาต์พุต วิธีแก้ปัญหาหลักที่นี่คือ 46- ไบต์#~IsomorphicGraphQ~TransitiveReductionGraph@#&ซึ่งทดสอบว่ากราฟที่กำหนดคือ isomorphic เพื่อลดสกรรมกริยาของมัน ส่วนที่เหลือจะแปลงอินพุตเป็นGraphวัตถุ


3

CJam (41 ไบต์)

q~:A_,{{Af=e__&}%_}*]:.|A.&A:$:e`e_2%1-*!

สาธิตออนไลน์ , เทียมทดสอบ

การผ่า

q~:A      e# Parse input and store in A
_,{       e# Loop V times
  {       e#   Extend adjacency list representation of G^i to G^(i+1)
    Af=   e#   by extending each path by one edge
    e__&  e#   and flattening. NB :| would be shorter but breaks for empty lists
  }%
  _       e#   Duplicate, so that we build up G^2, G^3, ..., G^n
}*]       e# Gather in a single array
:.|       e# Fold pointwise union, giving the reachability from each vertex by
          e# paths of length > 1
A.&       e# Pointwise intersect with the paths of length 1
          e# We hope to get an array of empty arrays

          e# Handle the awkward special case of duplicate edges:
A:$       e# Sort each adjacency list
:e`       e# Run-length encode each adjacency list
e_2%      e# Extract only the run lengths
1-        e# Discard the 1s - so we now have an empty array unless there's a dupe

*         e# Join. We hope to be joining an array of empty arrays by an empty array
          e# giving an empty array
!         e# Check that we get a falsy value (i.e. the empty array)

3

เยลลี่, 20 ไบต์

ị³$ÐĿ€ị@Fœ&¥";œ-Q$€E

ใช้การจัดทำดัชนีแบบอิง 1 ลองออนไลน์!

ภาพรวมที่หลวม

     €                for each vertex,
ị³$ÐĿ                   compute its reach.
        Fœ&¥"         intersect each vertex's lists of children and
      ị@                children's reaches.
             ;        then concatenate the list of intersections with
              œ-Q$€     all duplicate edges in the original graph.
                   E  are all elements equal? checks that all are empty lists,
                        meaning empty intersections and no duplicates.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.