นับต้นไม้


11

ต้นไม้เป็นที่เชื่อมต่อกราฟไม่มีทิศทางที่ไม่มีรอบ งานของคุณคือการนับจำนวนต้นไม้ที่แตกต่างกันที่มีจำนวนจุดยอดที่กำหนด

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

หากต้องการดูว่าทั้งหมดของต้นไม้ที่แตกต่างของขนาด 1-6 มีลักษณะเหมือนจะดูที่นี่

ชุดข้อมูลที่คุณพยายามส่งออกคือA000055ที่ OEIS

ข้อ จำกัด : 6วิธีการแก้ปัญหาของคุณจะต้องใช้เวลาในช่วงนาทีหรือน้อยกว่าที่จะทำงานในการป้อนข้อมูล นี่ไม่ได้มีวัตถุประสงค์เพื่อกำจัดอัลกอริธึมเวลาเอ็กซ์โปเนนเชียล แต่มันมีจุดประสงค์เพื่อกำจัดอัลกอริธึมเวลาทวีคูณเช่นทวีคูณบังคับให้ข้ามชุดขอบทั้งหมด

อินพุต:จำนวนเต็มใด ๆ ที่ไม่เป็นลบ

อินพุตอาจเป็นวิธีมาตรฐานรวมถึง STDIN พารามิเตอร์บรรทัดคำสั่งอินพุตฟังก์ชัน ฯลฯ

เอาท์พุท:จำนวนต้นไม้ที่แตกต่างที่มีจุดยอดมากที่สุดเท่าอินพุต

เอาท์พุทอาจจะด้วยวิธีมาตรฐานใด ๆ รวมถึง STDOUT ฟังก์ชั่นกลับมา ฯลฯ

ตัวอย่าง: ควรกลับ0, 1, 2, 3, 4, 5, 6, 71, 1, 1, 1, 2, 3, 6, 11

เกณฑ์การให้คะแนน:โค้ดกอล์ฟทีละไบต์ อาจเป็นรหัสที่สั้นที่สุดชนะ!

ช่องโหว่มาตรฐานต้องห้าม

คำตอบ:


3

CJam (69 ไบต์)

]qi:X,{1e|,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/z

การสาธิตออนไลน์

คำอธิบาย

แนวคิดพื้นฐานคือการใช้ฟังก์ชั่นการสร้างที่อธิบายไว้ใน OEIS อินพุตเป็นกรณีพิเศษที่น่ารังเกียจ แต่การปรับแต่งครั้งสุดท้ายที่ฉันทำลงเอยด้วยการผลิต- 1สำหรับกรณีนั้นดังนั้นz (สำหรับค่าสัมบูรณ์) จะจัดระเบียบมันขึ้นมา นั่นเป็นกลอุบายที่แปลกประหลาดที่สุดในที่นี่01z

.*:+{.*:+}:F~ซ้ำแล้วซ้ำอีกสามครั้งและดูเหมือนว่ามันจะสามารถประหยัดไบต์หากสกัดเป็น อย่างไรก็ตามกรณีนี้แบ่งเป็นกรณีพิเศษเพราะมันไม่ได้ดำเนินการวนรอบนอกเลย0


เราใช้ฟังก์ชันการสร้างเสริมสำหรับA000081ซึ่งคำเหล่านี้มีการเกิดซ้ำ

a[0] = 0
a[1] = 1
For n >= 1, a[n+1] = (sum_{k=1}^n a[n-k+1] * sum_{d|k} d * a[d]) / n

dkd×a[d]dk % d == 0 ? d : 0a.*akanN\f{1$%!*}W$.*:+

M

a[n+1]=1nk=1na[nk+1]×M[k]

aM1nn+1a

 qi:X,{   ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/

จุดของฟังก์ชั่นการสร้างเสริมได้รับจากส่วนสูตรของ A000055:

G.f.: A(x) = 1 + T(x) - T^2(x)/2 + T(x^2)/2,
where T(x) = x + x^2 + 2*x^3 + ... is the g.f. for A000081.

a

[x=0]+a[x]+12(a[x/2]i=0na[i]×a[ni])

a[x/2]x1,*X=

0\+a[0]=0X=0W\+2a[x]+i=0na[i]×a[ni]2a[x]

ดังนั้นเราจึงได้อธิบาย

 qi:X,{   ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/

1]N=1

1]qi:X,1>{ ... }/

X=0a[-1 1]0[x=0]X!+1e|

a1N=0

]qi:X,{ ... /+}/

เห็นได้ชัดว่าให้หารด้วยศูนย์ แต่ถ้าเราลอง

]qi:X,{1e| ... /+}/

จากนั้นก็ใช้งานได้ เราได้รับ

             e# Stack: [] 0
1e|          e# Stack: [] 1
,:):N        e# Stack: [] [1]
{            e# We only execute this loop once
  N\f{1$%!*} e#   1 divides 1, so stack: [] [1]
  W$.*       e#   Remember: if the two arrays supplied to the pointwise operation
             e#   are not the same length then the values from the longer one are
             e#   left untouched. Stack: [] [1]
  :+         e#   Fold over a singleton. Stack: [] 1
}%           e# And that was a map, so stack: [] [1]
1$W%.*:+     e# Another [1] [] .*:+, giving the same result: 1
N,/          e# 1 / 1 = 1
+            e# And we append 1 to a giving [1]

ซึ่งสร้างคุณค่าที่เราต้องการอย่างแท้จริง

X=01[-1](112(1×1))=10111z


1

Pyth, 35 ไบต์

l{m`SmSSMcXdUQk2.pQusm+L,dhHGhHtQ]Y

สาธิต.

โปรแกรมนี้สามารถแบ่งออกเป็นสองส่วน: ขั้นแรกเราสร้างต้นไม้ที่เป็นไปได้ทั้งหมดจากนั้นเราลบรายการที่ซ้ำกัน

usm+L,dhHGhHtQ]Yรหัสนี้จะสร้างต้นไม้: ต้นไม้ถูกแสดงเป็นรายการที่ตัดขอบแล้วดังนี้:

[0, 1, 0, 2, 2, 3, 1, 4]

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

ต่อไปสำหรับต้นไม้แต่ละต้นเราจะทำการติดฉลากใหม่ที่เป็นไปได้ นี้จะกระทำโดยการทำแผนที่มากกว่าพีชคณิตเป็นไปได้ทั้งหมดของจุด ( m ... .pQ) แล้ว transating XdUQkต้นไม้จากการสั่งซื้อมาตรฐานในการสั่งซื้อที่มี dเป็นต้นไม้kคือการเปลี่ยนรูป

จากนั้นเราแยกขอบออกเป็นรายการแยกด้วยc ... 2จัดเรียงจุดยอดในแต่ละขอบด้วยSMจัดเรียงขอบภายในต้นไม้ด้วยSให้การแสดงแบบแคนนอนของแต่ละต้นไม้ mSSMcXdUQk2.pQทั้งสองขั้นตอนรหัส

ตอนนี้เรามีรายการของรายการที่ประกอบด้วยการติดฉลากใหม่ของต้นไม้แต่ละต้น Sเราเรียงลำดับรายชื่อเหล่านี้ด้วย ต้นไม้ isomorphic สองต้นใด ๆ จะต้องสามารถถูก relabelled เข้าไปในกลุ่มของต้นไม้ ใช้ความเป็นจริงนี้เราแปลงแต่ละรายการสตริงด้วย`แล้วกำหนดรูปแบบของรายการเหล่านั้นด้วยและเอาท์พุทความยาวของมันด้วย{l

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