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

โปรแกรมหาต้นทุนขั้นต่ำในการเชื่อมต่อทุกจุดใน Python


สมมติว่าเรามีอาร์เรย์ที่เรียกว่าจุดที่มีบางจุดอยู่ในรูปแบบ (x, y) ตอนนี้ค่าใช้จ่ายในการเชื่อมต่อจุดสองจุด (xi, yi) และ (xj, yj) คือระยะห่างระหว่างจุดแมนฮัตตัน สูตรคือ |xi - xj| + |yi - yj|. เราต้องหาต้นทุนขั้นต่ำเพื่อเชื่อมต่อทุกจุด

ดังนั้น ถ้า input เหมือนกับ points =[(0,0),(3,3),(2,10),(6,3),(8,0)] แล้ว output จะเป็น 22 เพราะ

โปรแกรมหาต้นทุนขั้นต่ำในการเชื่อมต่อทุกจุดใน Python

ดังนั้นระยะทางทั้งหมดคือ (6+5+3+8) =22

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • points_set :=ชุดใหม่ถือตัวเลขจากช่วง 0 ถึงขนาดของจุด - 1
  • heap :=สร้าง heap ด้วยคู่ (0, 0)
  • visited_node :=ชุดใหม่
  • total_distance :=0
  • ในขณะที่ฮีปไม่ว่างเปล่าและขนาดของ visit_node <ขนาดของจุด ให้ทำ
    • (ระยะทาง, current_index) :=ลบองค์ประกอบออกจากฮีป
    • ถ้า current_index ไม่มีอยู่ใน visit_node แล้ว
      • แทรก current_index ลงใน visit_node
      • ลบ current_index ออกจาก points_set
      • total_distance :=total_distance + ระยะทาง
      • (x0, y0) :=คะแนน[current_index]
      • สำหรับ next_index แต่ละรายการใน points_set ทำ
        • (x1, y1) :=คะแนน[next_index]
        • แทรก (|x0 - x1| + |y0 - y1| , next_index) ลงในฮีป
  • คืนระยะทางทั้งหมด

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

import heapq
def solve(points):
   points_set = set(range(len(points)))
   heap = [(0, 0)]
   visited_node = set()
   total_distance = 0
   while heap and len(visited_node) < len(points):
      distance, current_index = heapq.heappop(heap)
      if current_index not in visited_node:
         visited_node.add(current_index)
         points_set.discard(current_index)
         total_distance += distance
         x0, y0 = points[current_index]
         for next_index in points_set:
            x1, y1 = points[next_index]
            heapq.heappush(heap, (abs(x0 - x1) + abs(y0 - y1), next_index))
   return total_distance
points = [(0,0),(3,3),(2,10),(6,3),(8,0)]
print(solve(points))

อินพุต

[(0,0),(3,3),(2,10),(6,3),(8,0)]

ผลลัพธ์

22