0Pricing
Competitive Programming Academy · บทเรียน

Floyd-Warshall สำหรับทุกคู่

หาพาธสั้นที่สุดระหว่างทุกคู่

Floyd-Warshall สำหรับทุกคู่ เป็นบทเรียน Competitive Programming Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Competitive Programming Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน

ทุกคู่พร้อมกัน

บางครั้งคุณต้องการเส้นทางสั้นที่สุดระหว่างโหนดทุกคู่ ไม่ใช่เพียงจากจุดเริ่มต้นเดียว นั่นคือปัญหาเส้นทางระหว่างทุกคู่

พบกับฟลอยด์–วอร์แชลล์

ฟลอยด์–วอร์แชลล์เติมตารางระยะทางเต็มรูปแบบสำหรับโหนดทุกคู่ด้วยลูปซ้อนกันสามชั้นที่เป็นระเบียบ และแทบไม่ต้องเตรียมข้อมูล

เมทริกซ์ระยะทาง

ใช้เมทริกซ์ที่ dist[i][j] คือค่าใช้จ่ายที่ดีที่สุดจาก i ไป j โดยเริ่มต้นจากเส้นเชื่อมโดยตรงที่โจทย์ให้มา

dist = [[INF] * n for _ in range(n)]

กำหนดเส้นทแยงมุม

โหนดทุกโหนดสามารถไปยังตัวเองได้โดยไม่มีค่าใช้จ่าย ดังนั้นให้กำหนดเส้นทแยงมุม dist[i][i] เป็นศูนย์ก่อนเริ่มปรับปรุงระยะทาง

for i in range(n):
    dist[i][i] = 0

แนวคิดเรื่องโหนดตัวกลาง

เคล็ดลับคือ อนุญาตให้เส้นทางผ่านโหนดตัวกลาง k แล้วตรวจสอบว่าการเดินทางผ่าน k มีค่าใช้จ่ายน้อยกว่าการไปโดยตรงหรือไม่

ลำดับของลูปสำคัญ

ลูปด้านนอกสุดคือ k ซึ่งเป็นจุดกึ่งกลางที่เลือกไว้ ส่วนลูปด้านใน i และ j จะลองโหนดทุกคู่โดยเทียบกับจุดกึ่งกลางนั้น

for k in range(n):
  for i in range(n):
    for j in range(n):

ขั้นตอนการปรับปรุงระยะทาง

สำหรับแต่ละคู่ ให้ปรับปรุงระยะทางผ่าน k หากเส้นทางจาก i ไป k แล้วไป j สั้นกว่า ให้ปรับ dist[i][j] เป็นค่าใช้จ่ายรวมดังกล่าว

if dist[i][k] + dist[k][j] < dist[i][j]:
    dist[i][j] = dist[i][k] + dist[k][j]

เหตุใด k จึงต้องอยู่ด้านนอก

เมื่อประมวลผล k เสร็จแล้ว ทุกคู่อาจใช้โหนดตัวกลางที่มีหมายเลขไม่เกิน k การวาง k ไว้ในลูปด้านนอกสุดจึงช่วยให้เงื่อนไขนี้ถูกต้อง

เส้นเชื่อมติดลบไม่เป็นปัญหา

ฟลอยด์–วอร์แชลล์รองรับเส้นเชื่อมติดลบ แต่ไม่รองรับวงจรติดลบ วงจรติดลบจะทำให้ค่าบางรายการบนเส้นทแยงมุมต่ำกว่าศูนย์

เวลาที่ใช้

ลูปสามชั้นบนโหนดจำนวน n โหนดทำให้ใช้เวลา O(n^3) และใช้พื้นที่ O(n^2) ซึ่งเหมาะในทางปฏิบัติเฉพาะเมื่อ n มีค่าไม่กี่ร้อย

ควรเลือกใช้เมื่อใด

เลือกฟลอยด์–วอร์แชลล์เมื่อกราฟมีขนาดเล็กและหนาแน่น และคุณต้องการระยะทางระหว่างทุกคู่จริง ๆ ไม่ใช่จากจุดเริ่มต้นเดียว

ตรวจสอบสั้น ๆ

ลูปใดต้องอยู่ด้านนอกสุดในฟลอยด์–วอร์แชลล์

ทบทวน: ฟลอยด์–วอร์แชลล์

เริ่มต้นเมทริกซ์ กำหนดเส้นทแยงมุมเป็นศูนย์ จากนั้นวนลูป k, i, j และปรับปรุงระยะทางผ่าน k เพื่อหาเส้นทางสั้นที่สุดระหว่างทุกคู่ในเวลา O(n^3) 🧮

คำถามที่พบบ่อย

บทเรียน “Floyd-Warshall สำหรับทุกคู่” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Floyd-Warshall สำหรับทุกคู่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Competitive Programming Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Floyd-Warshall สำหรับทุกคู่”

หาพาธสั้นที่สุดระหว่างทุกคู่ คุณปฏิบัติ Competitive Programming Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Competitive Programming Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Competitive Programming Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “Floyd-Warshall สำหรับทุกคู่” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Competitive Programming Academy นี้ได้ไหม

ได้ บทเรียน Competitive Programming Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Dijkstra ด้วยฮีป
  2. 0-1 BFS ด้วยดีค
  3. Bellman-Ford และเส้นเชื่อมติดลบ
  4. Floyd-Warshall สำหรับทุกคู่
← กลับไปที่ Competitive Programming Academy