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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Dijkstra ด้วยฮีป
- 0-1 BFS ด้วยดีค
- Bellman-Ford และเส้นเชื่อมติดลบ
- Floyd-Warshall สำหรับทุกคู่