Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาขนาดขั้นต่ำของเคล็กขนาดใหญ่ที่สุดในกราฟด้วย Python


สมมติว่าเราได้รับกราฟ และต้องการหาขนาดขั้นต่ำของเคล็ก (clique) ขนาดใหญ่ที่สุดในกราฟ เคล็กของกราฟคือเซตย่อยของกราฟที่ทุกคู่ของจุดยอดติดกัน คือมีเส้นขอบระหว่างทุกคู่ของจุดยอด การหาเคล็กขนาดใหญ่ที่สุดในกราฟทั่วไปไม่สามารถทำได้ใน polynomial time ดังนั้นเมื่อได้รับจำนวนโหนดและเส้นขอบของกราฟขนาดเล็ก เราต้องหาเคล็กขนาดใหญ่ที่สุดในมัน

เช่น ถ้าอินพุตคือ nodes = 4, edges = 4 ผลลัพธ์จะเป็น 2

โปรแกรมหาขนาดขั้นต่ำของเคล็กขนาดใหญ่ที่สุดในกราฟด้วย Python

ในกราฟด้านบน ขนาดสูงสุดของเคล็กคือ 2

วิธีแก้ปัญหา

  • กำหนดฟังก์ชัน helper() รับ x, y:
    • ga := x mod y
    • gb := y - ga
    • sa := ผลหารของ (x / y) + 1
    • sb := ผลหารของ (x / y)
    • return ga * gb * sa * sb + ga *(ga - 1) * sa * sa / 2 + gb * (gb - 1) * sb * sb / 2
  • i := 1, j := nodes + 1
  • while i + 1 < j:
    • p := i + floor((j - i) / 2)
    • k := helper(nodes, p)
    • ถ้า k < edges: i := p
    • มิฉะนั้น: j := p
  • return j

ตัวอย่าง

import math

def helper(x, y):
    ga = x % y
    gb = y - ga
    sa = x // y + 1
    sb = x // y
    return ga * gb * sa * sb + ga * (ga - 1) * sa * sa // 2 + gb * (gb - 1) * sb * sb // 2

def solve(nodes, edges):
    i = 1
    j = nodes + 1
    while i + 1 < j:
        p = i + (j - i) // 2
        k = helper(nodes, p)
        if k < edges:
            i = p
        else:
            j = p
    return j

print(solve(4, 4))

อินพุต

4,4

เอาต์พุต

2