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

โปรแกรมหาผลรวมของต้นทุนขั้นต่ำภายในกราฟจากจุดยอดทั้งหมดใน Python


สมมติว่ามีกราฟถ่วงน้ำหนักที่มีจุดยอด n จุดและขอบ m ขอบมีน้ำหนักเป็นยกกำลัง 2 จุดยอดใดๆ สามารถเข้าถึงได้จากจุดยอดใดๆ ในกราฟ และค่าใช้จ่ายในการเดินทางจะเป็นการเพิ่มน้ำหนักของขอบทั้งหมดในกราฟ เราจะต้องกำหนดผลรวมของต้นทุนขั้นต่ำระหว่างจุดยอดแต่ละคู่

ดังนั้นหากอินพุตเป็นแบบ

โปรแกรมหาผลรวมของต้นทุนขั้นต่ำภายในกราฟจากจุดยอดทั้งหมดใน Python

และจำนวนจุดยอด (n) =6; แล้วผลลัพธ์จะเป็น 2696

ผลรวมของระยะทางทั้งหมดคือ 2696

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

  • กำหนดฟังก์ชัน par_finder() นี่จะใช้เวลา i, par
    • ถ้า par[i] เหมือนกับ -1 แล้ว
      • คืนผม
    • res :=par_finder(par[i], par)
    • พาร์[i] :=res
    • ผลตอบแทน
  • กำหนดฟังก์ชัน helper() นี่จะใช้เวลา i, par, w, G, n
    • ลูก :=1
    • สำหรับแต่ละรายการใน G[i] ทำ
      • ถ้า item[0] เหมือนกับพาร์ แล้ว
        • ติดตามตอนต่อไป
      • มิฉะนั้น
        • child :=child + helper(item[0], i, item[1], G, n)
      • ถ้าพาร์ไม่เหมือนกับ -1 แล้ว
        • ans :=ans + child * (n - child) *(1 * 2^w)
      • คืนลูก
  • G :=รายการใหม่ที่มี n + 1 รายการอื่น ๆ
  • ขอบ :=รายการใหม่
  • สำหรับแต่ละรายการในท้องถนน ทำ
    • u :=item[0]
    • v :=item[1]
    • w :=item[2]
    • แทรก (u-1, v-1, w) ที่ส่วนท้ายของขอบ
  • จัดเรียงขอบรายการตามน้ำหนักขอบ
  • par :=รายการใหม่ของขนาด n + 1 เริ่มต้นด้วย -1
  • r_edge :=รายการใหม่
  • สำหรับแต่ละ i ในขอบ ทำ
    • ถ้า par_finder(i[0], par) เหมือนกับ par_finder(i[1], par) แล้ว
      • ติดตามตอนต่อไป
    • มิฉะนั้น
      • แทรก i ที่ส่วนท้ายของ r_edge
      • ใส่คู่ (i[1],i[2]) ที่ส่วนท้ายของ G[i[0]]
      • ใส่คู่ (i[0],i[2]) ที่ส่วนท้ายของ G[i[1]]
      • par[par_finder(i[0], par)] :=par_finder(i[1], พาร์)
  • ตอบ :=0
  • ตัวช่วย(0, -1, 0, G, n)
  • คืนสินค้า

ตัวอย่าง

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

def par_finder(i, par) :if par[i] ==-1 :return i res =par_finder(par[i], par) par[i] =res ส่งคืนผู้ช่วย resdef (i, par, w, G, n) :global ans child =1 สำหรับรายการใน G[i] :if item[0] ==par :Continue else :child +=helper(item[0],i,item[1], G, n ) if par !=-1 :ans +=child * (n - child) * (1 < 

อินพุต

<ก่อนหน้า>6, [(1,4,8), (2,4,4), (3,4,4), (3,4,2), (5,3,8), (6,3 ,2)]

ผลลัพธ์

2696