ในที่สุดฉันเสียเวลา 3 วัน
ในการแก้ไขคำถามเกี่ยวกับกราฟที่
ใช้ใน
การหาระยะทางที่สั้นที่สุด
โดยใช้ BFS
อยากแชร์ประสบการณ์.
When the (undirected for me) graph has
fixed distance (1, 6, etc.) for edges
#1
We can use BFS to find shortest path simply by traversing it
then, if required, multiply with fixed distance (1, 6, etc.)
#2
As noted above
with BFS
the very 1st time an adjacent node is reached, it is shortest path
#3
It does not matter what queue you use
deque/queue(c++) or
your own queue implementation (in c language)
A circular queue is unnecessary
#4
Number of elements required for queue is N+1 at most, which I used
(dint check if N works)
here, N is V, number of vertices.
#5
Wikipedia BFS will work, and is sufficient.
https://en.wikipedia.org/wiki/Breadth-first_search#Pseudocode
ฉันเสียเวลาไป 3 วันในการลองใช้ทางเลือกอื่นทั้งหมดข้างต้นการตรวจสอบและยืนยันซ้ำอีกครั้งแล้วครั้งเล่าข้างต้น
ไม่ใช่ปัญหา
(พยายามใช้เวลาค้นหาปัญหาอื่น ๆ หากคุณไม่พบปัญหาใด ๆ กับข้อ 5 ข้างต้น)
คำอธิบายเพิ่มเติมจากความคิดเห็นด้านล่าง:
A
/ \
B C
/\ /\
D E F G
สมมติด้านบนคือกราฟของคุณ
จะลงไปด้านล่าง
สำหรับ A ตัวช่วยคือ B & C
สำหรับ B ตัวช่วยคือ D & E
สำหรับ C ตัวช่วยคือ F & G
พูดว่าโหนดเริ่มต้นคือ A
เมื่อคุณไปถึง A ถึง B & C ระยะทางที่สั้นที่สุดถึง B & C จาก A คือ 1
เมื่อคุณไปถึง D หรือ E ถึง B ระยะทางที่สั้นที่สุดไปยัง A & D คือ 2 (A-> B-> D)
ในทำนองเดียวกัน A-> E คือ 2 (A-> B-> E)
ด้วย A-> F & A-> G คือ 2
ดังนั้นตอนนี้แทนที่จะเป็น 1 ระยะห่างระหว่างโหนดถ้าเป็น 6 ให้คูณคำตอบด้วย 6
ตัวอย่างเช่น
ถ้าระยะห่างระหว่างแต่ละโหนดเป็น 1 ดังนั้น A-> E คือ 2 (A-> B-> E = 1 + 1 )
ถ้าระยะห่างระหว่างแต่ละอันคือ 6 ดังนั้น A-> E คือ 12 (A-> B-> E = 6 + 6)
ใช่ bfs อาจใช้เส้นทางใดก็ได้
แต่เรากำลังคำนวณสำหรับเส้นทางทั้งหมด
ถ้าคุณต้องไปจาก A ถึง Z เราจะเดินทางทุกเส้นทางจาก A ไปยังตัวกลาง I และเนื่องจากจะมีหลายเส้นทางที่เราทิ้งทั้งหมดยกเว้นเส้นทางที่สั้นที่สุดจนถึงฉันจากนั้นเดินต่อด้วยเส้นทางที่สั้นที่สุดไปยังโหนดถัดไป J
อีกครั้งหาก มีหลายเส้นทางจาก I ถึง J เราใช้เวลาเพียง
ตัวอย่างเดียว
สมมติว่า
A -> ฉันมีระยะทาง 5
(STEP) สมมติ I -> J เรามีหลายเส้นทางระยะทาง 7 และ 8 เนื่องจาก 7 สั้นที่สุด
เราใช้ A -> J เป็น 5 (A-> I สั้นที่สุด) + 8 (สั้นที่สุดในขณะนี้) = 13
ดังนั้น A-> J คือ 13 ตอนนี้
เราทำซ้ำตอนนี้ด้านบน (STEP) สำหรับ J -> K ไปเรื่อย ๆ จนกว่าเราจะได้ ถึง Z
อ่านส่วนนี้ 2 หรือ 3 ครั้งแล้ววาดลงบนกระดาษคุณจะได้รับสิ่งที่ฉันพูดขอให้โชคดี