สมมติว่ามีกราฟถ่วงน้ำหนักที่มีจุดยอด n จุดและขอบ m ขอบมีน้ำหนักเป็นยกกำลัง 2 จุดยอดใดๆ สามารถเข้าถึงได้จากจุดยอดใดๆ ในกราฟ และค่าใช้จ่ายในการเดินทางจะเป็นการเพิ่มน้ำหนักของขอบทั้งหมดในกราฟ เราจะต้องกำหนดผลรวมของต้นทุนขั้นต่ำระหว่างจุดยอดแต่ละคู่
ดังนั้นหากอินพุตเป็นแบบ
และจำนวนจุดยอด (n) =6; แล้วผลลัพธ์จะเป็น 2696
ผลรวมของระยะทางทั้งหมดคือ 2696
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน par_finder() นี่จะใช้เวลา i, par
- ถ้า par[i] เหมือนกับ -1 แล้ว
- คืนผม
- res :=par_finder(par[i], par)
- พาร์[i] :=res
- ผลตอบแทน
- ถ้า par[i] เหมือนกับ -1 แล้ว
- กำหนดฟังก์ชัน 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)
- คืนลูก
- ถ้า item[0] เหมือนกับพาร์ แล้ว
- 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], พาร์)
- ถ้า par_finder(i[0], par) เหมือนกับ par_finder(i[1], par) แล้ว
- ตอบ :=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