Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Chương trình tìm kích thước tối thiểu của clique lớn nhất trong đồ thị trong Python


Giả sử cho một đồ thị, cần tìm kích thước tối thiểu của clique lớn nhất trong đồ thị. Clique là tập con đỉnh mà mọi cặp đỉnh đều kề nhau. Việc tìm clique lớn nhất là bài toán NP-hard, nhưng với số đỉnh và cạnh nhỏ, ta có thể tìm được.

Ví dụ, nodes = 4, edges = 4, đầu ra sẽ là 2.

Chương trình tìm kích thước tối thiểu của clique lớn nhất trong đồ thị trong Python

Trong đồ thị trên, kích thước clique lớn nhất là 2.

Giải pháp

Để giải quyết bài toán này, ta sử dụng định lý Turán và tìm kiếm nhị phân:

  • Định nghĩa hàm helper(x, y):
    • ga := x % y
    • gb := y - ga
    • sa := x // y + 1
    • sb := x // y
    • Trả về ga * gb * sa * sb + ga * (ga - 1) * sa * sa // 2 + gb * (gb - 1) * sb * sb // 2
  • i := 1, j := nodes + 1
  • Khi i + 1 < j:
    • p := i + (j - i) // 2
    • k := helper(nodes, p)
    • Nếu k < edges: i := p
    • Ngược lại: j := p
  • Trả về j

Ví dụ minh họa

Xem triển khai sau để hiểu rõ hơn:

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))

Đầu vào

4,4

Đầu ra

2