จำนวนทอพอโลยีทั้งหมด


11

สำหรับ DAG ที่กำหนด (กราฟ acyclic กำกับ) การเรียงลำดับทอพอโลยีแต่ละอันเป็นการเปลี่ยนแปลงของจุดยอดทั้งหมดที่ทุก ๆ ขอบ(u, v)ใน DAG คุณจะปรากฏก่อนvในการเปลี่ยนรูป

งานของคุณคือการคำนวณจำนวนโทโพโลยีทั้งหมดของ DAG ที่กำหนด

กฎระเบียบ

  • คุณสามารถใช้รูปแบบใดก็ได้เพื่อแสดงกราฟเช่น adjacency matrix, adjacency list หรือ edge list ตราบใดที่คุณไม่มีการคำนวณที่มีประโยชน์ในการเข้ารหัสของคุณ คุณยังสามารถมีสิ่งต่าง ๆ เช่นจำนวนจุดยอดหรือรายการจุดยอดในอินพุตถ้าสิ่งเหล่านั้นมีประโยชน์
  • คุณสามารถสมมติกราฟในอินพุตได้เสมอ DAG (ไม่มีรอบใด ๆ )
  • โปรแกรมของคุณควรทำงานในทางทฤษฎีสำหรับการป้อนข้อมูลใด ๆ แต่มันอาจล้มเหลวได้หากมันล้นประเภทจำนวนเต็มพื้นฐานในภาษาของคุณ
  • ชื่อของจุดยอดสามารถเป็นค่าต่อเนื่องในประเภทใดก็ได้ ตัวอย่างเช่น: ตัวเลขเริ่มต้นที่ 0 หรือ 1 (และเฉพาะในกรณีที่คุณไม่ได้เก็บรหัสไว้ในหมายเลขนี้แน่นอน)
  • นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุดชนะ

ตัวอย่าง

นี่เป็นอินพุตเดียวกันในรูปแบบที่ต่างกัน โปรแกรมของคุณไม่จำเป็นต้องยอมรับทั้งหมด จุดยอดเป็นจำนวนเต็มเริ่มต้นที่ 0 เสมอ

Adjacency list:
[ [1 2 3 5] [2 4] [] [2] [] [3] ]
Adjacency matrix:
[ [0 1 1 1 0 1] [0 0 1 0 1 0] [0 0 0 0 0 0] [0 0 1 0 0 0] [0 0 0 0 0 0] [0 0 0 1 0 0] ]
Edge list:
6 [ [0 1] [0 2] [0 3] [0 5] [1 2] [1 4] [3 2] [5 3] ]

มันเป็นกราฟที่แสดงในภาพนี้:

กราฟตัวอย่าง

ผลลัพธ์ควรเป็น:

9

ทอพอโลยีแปลก ๆ คือ:

[0 1 4 5 3 2]
[0 1 5 4 3 2]
[0 1 5 3 4 2]
[0 1 5 3 2 4]
[0 5 1 4 3 2]
[0 5 1 3 4 2]
[0 5 1 3 2 4]
[0 5 3 1 4 2]
[0 5 3 1 2 4]

ฟังก์ชั่น? โปรแกรมทั้งหมด? ทั้ง?
isaacg

@isaacg ทั้งคู่
jimmy23013

คำตอบ:


4

CJam - 25

q~{_f{1$-_j@j@&!*}_!+:+}j

ด้วยความช่วยเหลือที่ดีจากผู้ใช้ 23013 :)

ลองออนไลน์

คำอธิบาย:

อัลกอริทึมทั่วไปเป็นเช่นเดียวกับในการแก้ปัญหาของงูหลาม XNOR
ที่สำคัญที่นี่คือjผู้ประกอบการซึ่งจะเรียกซ้ำเรียกคืน มันต้องใช้พารามิเตอร์ค่าหรืออาร์เรย์สำหรับค่าเริ่มต้น (เช่นใน f (0), f (1), ฯลฯ ) และบล็อกเพื่อกำหนด recursion ตัวjดำเนินการจะใช้อีกครั้งภายในบล็อกเพื่อทำการเรียกซ้ำ (และบันทึก) ไปยังบล็อกเดียวกัน มันสามารถใช้กับพารามิเตอร์หลายตัวได้ แต่ไม่ใช่ในกรณีนี้
นวัตกรรมที่ยอดเยี่ยมของ user23013 คือการใช้ j กับชนิดข้อมูลที่แตกต่างกันทำให้การใช้รายการ adjacency เป็นอาร์เรย์ของค่าเริ่มต้น

q~             read and evaluate the input (vertex list followed by adjacency list)
{…}j           run the block on the vertex list, doing memoized recursion
                and using the adjacency list for initial values
    _          copy the vertex list
    f{…}       for each vertex and the vertex list
        1$-    copy the vertex and remove it from the list
                Python: "V-{v}"
        _j     copy the reduced list and call the j block recursively
                this solves the problem for the reduced vertex list
                Python: "f(G,V-{v})"
        @j     bring the vertex to the top of the stack and call the j block recursively
                in this case, it's called with a vertex rather than a list
                and the memoized value is instantly found in the list of initial values
                effectively, this gets the list of vertices adjacent to the current vertex
                Python: "G[v]"
        @&     bring the reduced list to the top of the stack and intersect
        !*     multiply the number of topological sorts of the reduced vertex list
                with 1 if the intersection was empty and 0 if not
                Python: equivalent to "*(V-G[v]==V)"
               after this loop we get an array of sub-results for the reduced vertex lists
    _!+        add 1 or 0 to the array if the array was empty or not
                because we want to get 1 for the empty array
                Python: equivalent to "V<{0}or"
    :+         add the numbers in the array
                Python: "sum(…)"

1
แก้ไขเพื่ออนุญาตรายการจุดสุดยอดอย่างชัดเจนในอินพุต ตอนนี้ 25 ไบต์
jimmy23013

@ user23013 เวทมนตร์ชนิดนี้คืออะไร? : o
aditsu ออกเพราะ SE นั้นชั่วร้าย

7

Python 58

f=lambda G,V:V<{0}or sum(f(G,V-{v})*(V-G[v]==V)for v in V)

การป้อนข้อมูลประกอบด้วยพจนานุกรมถ้อยคำและชุดจุดสุดยอดGV

G = {0:{1,2,3,5}, 1:{2,4}, 2:set(), 3:{2}, 4:set(), 5:{3}, 6:set()}
V = {0,1,2,3,4,5}

รหัสซ้ำซ้ำ ชุดVเก็บโหนดทั้งหมดที่ยังคงต้องเยี่ยมชม สำหรับแต่ละโหนดถัดไปที่เป็นไปได้เราจะตรวจสอบความเหมาะสมของมันโดยดูว่าไม่มีจุดยอดที่เหลือชี้ไปที่มันด้วยการV-G[v]==VตรวจสอบVและG[v]แยกกัน สำหรับจุดยอดที่เหมาะสมเช่นนี้เราเพิ่มจำนวนการเรียงทอพอโลยีที่ลบออก ในกรณีพื้นฐานชุดว่างให้ 1


+1 สำหรับไม่ใช้รายการขอบ
jimmy23013

5

Mathematica, 80 57 51 ไบต์

Count[Permutations@#,l_/;l~Subsets~{2}~SubsetQ~#2]&

การใช้คำจำกัดความตรงไปตรงมามาก ฉันแค่สร้างพีชคณิตทั้งหมดและนับว่ามันใช้ได้แค่ไหน เพื่อตรวจสอบว่าการเปลี่ยนรูปถูกต้องหรือไม่ฉันได้รับจุดยอดทั้งหมดในการเปลี่ยนรูป สะดวกSubsets[l,{2}]ไม่เพียง แต่มอบทุกคู่ให้กับฉัน แต่ยังรักษาลำดับที่พบในl- สิ่งที่ฉันต้องการ

ด้านบนเป็นฟังก์ชั่นที่คาดหวังว่ารายการจุดสุดยอดและรายการขอบเช่น

f[{1, 2, 3, 4, 5, 6}, {{1, 2}, {1, 3}, {1, 4}, {1, 6}, {2, 3}, {2, 5}, {4, 3}, {6, 4}}]

fถ้าคุณเรียกใช้ฟังก์ชัน

ฉันจะลองเล่นกอล์ฟนี้หรืออาจใช้วิธีอื่นในภายหลัง


2

Pyth, 27 ไบต์

Mlf!sm}_dHfq2lYyTfqSZUZ^UGG

กำหนดฟังก์ชั่น 2 gการป้อนข้อมูล อินพุตแรกคือจำนวนของจุดยอดที่สองคือรายการของขอบกำกับ

ทดสอบ:

Code:
Mlf!sm}_dHfq2lYyTfqSZUZ^UGGghQeQ

Input:
6, [ [0, 1], [0, 2], [0, 3], [0, 5], [1, 2], [1, 4], [3, 2], [5, 3] ]

ลองที่นี่


@ user23013 Boht นับและรายชื่อที่มีการใช้ในการแสดงออก^UGGซึ่งจะสร้างทุกรายการการเข้ามาของG range(len(G))
isaacg

ฉันหมายถึงมันจะสั้นลงหรือไม่ถ้าคุณใช้[0, 1, ...]โดยตรงในอินพุต
jimmy23013

@ user23013 ไม่มีก็จะเป็นระยะเวลาเดียวกันกับ^GlG ^UGG
isaacg

2

Haskell, 102 107 100 89 85 ไบต์

import Data.List
(%)=elemIndex
n#l=sum[1|p<-permutations[0..n],and[u%p<v%p|[u,v]<-l]]

อินพุตคือหมายเลขจุดสูงสุดสูงสุด (เริ่มต้นด้วย 0) และรายการขอบโดยที่ขอบคือรายการองค์ประกอบสองรายการ ตัวอย่างการใช้งาน:5 # [[0,1], [0,2], [0,3], [0,5], [1,2], [1,4], [3,2], [5,3]]

วิธีการทำงาน: นับพีชคณิตทั้งหมดpของจุดที่ขอบทั้งหมด[u,v]ตอบสนอง: ตำแหน่งuในpน้อยกว่าตำแหน่งในv pนั่นเป็นการดำเนินการตามคำจำกัดความโดยตรง

แก้ไข: รุ่นแรกของฉันส่งกลับทอพอโลยีเรียงลำดับตัวเองและไม่กี่มี ซ่อมมัน.

แก้ไขครั้งที่สอง: ใช้งานไม่ได้กับกราฟที่ไม่มีจุดเชื่อมต่อ ซ่อมมัน.


ฉันกำลังคิดที่จะเพิ่มกรณีทดสอบที่มีเฉพาะจุดยอด แต่ไม่ใช่ขอบ ...
jimmy23013

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