Breadth First Search Algorithm | Shortest Path | Graph Theory

Поділитися
Вставка
  • Опубліковано 20 тра 2024
  • Breadth First Search (BFS) algorithm explanation video with shortest path code
    Algorithms repository:
    github.com/williamfiset/algor...
    Video Slides:
    github.com/williamfiset/Algor...
    =====================================
    Practicing for interviews? I have used, and recommend `Cracking the Coding Interview` which got me a job at Google. Link on Amazon: amzn.to/3cvMof5
    A lot of the content on this channel is inspired by the book `Competitive Programming` by Steven Halim which I frequently use as a resource and reference. Link on Amazon: amzn.to/3wC2nix
    Support me by purchasing the full graph theory course on Udemy which includes additional problems, exercises and quizzes not available on UA-cam:
    www.udemy.com/course/graph-th...

КОМЕНТАРІ • 201

  • @cynderellylastname6060
    @cynderellylastname6060 12 днів тому +1

    Wow this is by far the most understandable explanation of this concept that I've seen. Thank you!

  • @sarahzhang8258
    @sarahzhang8258 4 роки тому +229

    the best explanation I 've seen fo far. Simple, clear, and focus without redundant words. Saving a lot of time. Love it and subscribed

    • @shadmansudipto7287
      @shadmansudipto7287 3 роки тому +1

      Agreed

    • @alnnvk3186
      @alnnvk3186 3 роки тому +1

      @Louis Jesse dude you chose the wrong type of people to dump your bs on. computer scientists dgaf about your animal relations.

  • @dannyfogel9156
    @dannyfogel9156 4 роки тому +51

    Thank you so much!! As a really confused CS student who just started algorithms course this helped me a lot!

  • @MrKingoverall
    @MrKingoverall 3 роки тому +22

    I appreciate the effort you put into making these tutorials man. You are the best.

  • @murnoth
    @murnoth Рік тому +5

    You're one of the few explaining it with an end node and path reconstruct. Thank you!

  • @shemsnow3711
    @shemsnow3711 2 роки тому +35

    Wow this is such a basic concept I can't believe my teacher couldn't explain it. He just gave us actual code to start out with. Universities seriously need to stop hiring grad students as teachers.

  • @yadav-r
    @yadav-r 2 роки тому +2

    Wow, so many great tutors on the internet already, but you have explained it in a very digestible manner, thank you for your service, this helped me in getting my first dev job.

  • @chuckchen2851
    @chuckchen2851 3 роки тому +4

    Crystal clear explanation. Many implementation details well covered!

  • @expansivegymnast1020
    @expansivegymnast1020 3 роки тому +6

    Good explanation. That queue drawing finally helped me get it.

  • @cam7minus1
    @cam7minus1 2 роки тому +2

    You turned 2 hours of confusing lectures into a simple 7 minute video. Thank you!

  • @Andrei-ds8qv
    @Andrei-ds8qv 3 роки тому +4

    Trying for 3 hours to do it myself, came here to see the solution. I forgot the prev array, and In fact even If I visited the whole graph and found the final node, didn't know how to reconstruct everything :D Thanks a lot

  • @hk32100c18
    @hk32100c18 5 років тому +13

    You have saved my academic.

  • @sukhrobgolibboev
    @sukhrobgolibboev 4 роки тому +10

    This is the best explanation I've seen so far. Thank you!

  • @GovinthanKSAIML
    @GovinthanKSAIML 29 днів тому +1

    Best explanation ever, hope to see more videos like this from you William! Keep up the good work

  • @jonathanbenavidesvallejo2870
    @jonathanbenavidesvallejo2870 4 роки тому +2

    You are a legend! Best explanation ever!

  • @jamespottex5197
    @jamespottex5197 3 роки тому

    Best Explanation and Representation for BFS topic on UA-cam...

  • @efrainm4649
    @efrainm4649 2 роки тому +1

    This was extremely useful. Thanks!
    Keep working this way!

  • @Hajjat
    @Hajjat 5 років тому +1

    Quality vids.. Subscribed. Thanks for your time and effort!

  • @andrewfrenir
    @andrewfrenir 2 роки тому

    The best video about BFS I've watched! Thanks I already understand it! :D

  • @rodrigoos3
    @rodrigoos3 3 роки тому

    Best explanation possible. Thanks a lot!

  • @gabrielearle1678
    @gabrielearle1678 3 роки тому

    thanks man, amazing video. so straightforward and useful!

  • @drygordspellweaver8761
    @drygordspellweaver8761 Рік тому

    Currently implementing this "in the wild". Good to see that the "right" way to do it is pretty much what I figured out

  • @tkstudiox
    @tkstudiox 4 роки тому +1

    Great video! Thaaanks for the clear explanation.

  • @biaojin5188
    @biaojin5188 4 роки тому +6

    hi thanks for the very clear explaination, but I cannot find the code where we are trying to find the Min or max path from S to E

  • @meeba-dev
    @meeba-dev 2 роки тому

    Thank you very much William. You are the best!

  • @viveksuman9600
    @viveksuman9600 2 роки тому +1

    Your animation just clicked it for me. Awesome :)

  • @xeniaioannidou8811
    @xeniaioannidou8811 3 роки тому

    Very good explanation and it is nice that you added pseudocode !!!!

  • @panagiotistzakis6799
    @panagiotistzakis6799 Рік тому

    Thanks for your time sir ...the best and simple explanation .

  • @FlashTheMito
    @FlashTheMito 2 роки тому

    Thank you so much, it helped a lot! Great video and explanation! (Greetings from Brazil!)

  • @unlucky-777
    @unlucky-777 Рік тому

    Thanks for the easy and understandable explanation

  • @anhmai81
    @anhmai81 6 днів тому

    this is an awesome explanation. Thank you very much.

  • @SatishKumar-jb9qm
    @SatishKumar-jb9qm 3 роки тому

    Thank you - this was easy to understand.

  • @LakshmikanthAyyadevara
    @LakshmikanthAyyadevara 4 роки тому

    best explanation!!!!!! may god bless you

  • @parasarora5869
    @parasarora5869 5 років тому +1

    thank you so much !! 😄 ... awesome video 👍

  • @kamalulazmim3820
    @kamalulazmim3820 3 роки тому

    Very clear, thank you so much!

  • @prajaktadeokule781
    @prajaktadeokule781 2 роки тому

    thanks for the amazing explanation!

  • @ut9910
    @ut9910 3 роки тому

    Awesome explanation easy to understand , animations are great to follow along.Liked 👍and subscribed

  • @stunning-computer-99
    @stunning-computer-99 5 років тому +4

    That's a fantastic explanation. re watching BFS for my job interview. thanks mate.

    • @CloroxBleach-hi6jd
      @CloroxBleach-hi6jd 4 роки тому +2

      why the fuck do you need to know that shit for a job interview. Is the interviewer gonna give you a algorithm exam.

    • @ade1819
      @ade1819 4 роки тому +8

      @@CloroxBleach-hi6jd Plenty of job interviews go over your data structure and algorithms knowledge...

    • @CloroxBleach-hi6jd
      @CloroxBleach-hi6jd 4 роки тому +3

      @@ade1819 That's bullshit, if you have the degree than you've taken the class. Fuck algorithms anyway, coding is fun but algorithms are confusing shit

    • @hungp9227
      @hungp9227 4 роки тому +19

      @@CloroxBleach-hi6jd this is why companies don't hire you

    • @CloroxBleach-hi6jd
      @CloroxBleach-hi6jd 4 роки тому +1

      @@hungp9227 I haven't applied dumbass, retarded companies will want you to answer their stupid fucking algorithm questions and give you a job that has nothing to do with algorithms. That's why algorithms are shit

  • @yashshah1764
    @yashshah1764 3 роки тому

    Thank you bhai! I am grateful for your teachings

  • @cebenbb
    @cebenbb 4 роки тому +7

    Hey, important little thing: krep some padding at the bottom becos of the sub. I watch videos with subs, and i could not see the bottom of the graph.
    Aaaand, cool video :)

  • @aayush5474
    @aayush5474 3 роки тому

    I could listen to your voice all day

  • @matheuscosta5330
    @matheuscosta5330 3 роки тому

    this video is a miracle of learning

  • @JishnuLoL
    @JishnuLoL 9 місяців тому

    Just keep it up. Nice videos

  • @VOLTDOGmusic
    @VOLTDOGmusic 5 років тому +19

    Great video!
    Do you mind explaining how the for loop in the reconstructPath method works?
    Specifically,
    for(at = e; at != null; at = prev[at])
    How is this being updated to continue thru the loop?
    Thanks again, William!

    • @WilliamFiset-videos
      @WilliamFiset-videos  5 років тому +26

      Yeah, the prev array at index i (i.e prev[i]) contains the index of the node used to get to node i. To reconstruct the path we work backwards from the end node 'e' until we reach the start node. The start node does not have a parent so that's why we have 'at != null' as the end condition. Each iteration of the loop you trace back one node, this is 'at = prev[at]'.

    • @VOLTDOGmusic
      @VOLTDOGmusic 5 років тому +1

      @@WilliamFiset-videos Thanks William! Really appreciate the reply! Keep up the great work!!

    • @bl4ck21
      @bl4ck21 3 роки тому +5

      @@WilliamFiset-videos thanks I also got stuck there

    • @softwarecraftsman3091
      @softwarecraftsman3091 Рік тому

      @@bl4ck21 In the first iteration, at =e. In the second iteration, at = prev[at]. Each time, at is incrementally progressed to prev[at].

  • @shanedetsch
    @shanedetsch 2 роки тому +3

    Should not the reconstructPath function definition have ( if at == s { break; } ) in the for loop?

  • @MrSanjaychetwani
    @MrSanjaychetwani Рік тому

    Thank you, this was very helpful!

  • @angiishere
    @angiishere 2 роки тому

    I am late to the Party but i want to say: Great Tutorial! Exactly what i needed!

  • @farruhhabibullaev5316
    @farruhhabibullaev5316 4 роки тому

    Best explanation!

  • @FireboxTrainingCourses
    @FireboxTrainingCourses 3 роки тому

    Awesome video - thank you!

  • @archiexzzz
    @archiexzzz 3 роки тому +1

    Best explanation

  • @momke8169
    @momke8169 22 дні тому

    brilliant video thanks

  • @ramansarabha871
    @ramansarabha871 Рік тому

    Thanks! You're godsend!

  • @happysquirrelwhats-tube8768

    Best of the best! thank you

  • @rakeshv1490
    @rakeshv1490 2 роки тому

    Great videos. Thank you so much.

  • @xxozmozxx
    @xxozmozxx 5 років тому +1

    thank you sir very helpful but if you talk about algorithm analysis more it would be better.

  • @kartikkalani6306
    @kartikkalani6306 Рік тому

    Thank you sir🙏

  • @albert21994
    @albert21994 4 роки тому +1

    Your videos are the best on graph theory!

  • @shahidsiddiqui7152
    @shahidsiddiqui7152 3 роки тому

    beautiful explanation :)

  • @vinittodai911
    @vinittodai911 2 роки тому

    One of the best!

  • @IamKarthraj
    @IamKarthraj Рік тому

    Cant thank enough for this !!!

  • @gvsharma2643
    @gvsharma2643 4 роки тому

    This is awesome

  • @RobertCorrington
    @RobertCorrington 3 роки тому

    The visited queue would contain ALL of the neighbors that were visited, right?
    How would simply reversing the visited queue give you the shortest path? There would be visited neighbors in the queue that were not along the shortest path. How do you prune out those suboptimal neighbors?

  • @zeekcom12
    @zeekcom12 2 роки тому

    Holy crap the queue example is perfect

  • @jff711
    @jff711 Рік тому

    Thank you!

  • @briannguyen5057
    @briannguyen5057 3 роки тому

    very helpful!

  • @ezlyfe9762
    @ezlyfe9762 4 роки тому

    someone i can understand thank god

  • @anhmai81
    @anhmai81 6 днів тому

    Thanks!

  • @shashankesh
    @shashankesh 3 роки тому +1

    What if there are multiple shortest path for s to e? And I want to retrieve all of them.

  • @surfingweb1315
    @surfingweb1315 23 дні тому

    we need an order, right ? it goes like we start from the smallest number to the biggest or backward, am i right ?

  • @karthicksabhapathy993
    @karthicksabhapathy993 4 роки тому +2

    Hi, i have a doubt. Since the values are marked from 0-12, graph.get(node) works perfectly considering the node value is the index value. What if the values aren't like this? Instead of graph.get(node), do we run a for loop to find? Please help & Nice video btw. :)

    • @arvindojha1101
      @arvindojha1101 3 роки тому

      you can map the node value while constructing the the graph using adjacency list or adj matrix.

  • @rainneskye527
    @rainneskye527 2 роки тому

    thank you!!

  • @yuqingwang7375
    @yuqingwang7375 3 роки тому

    Thank you! Thank you! Thank U!!!!!!!!!!!

  • @bailey2652
    @bailey2652 2 роки тому

    I love these ones that focus on the actual useful abstraction instead of trying to explain it concretely in mathematics. If I didn't understand the abstract, I wouldn't be studying computer science! Stop putting the cart before the horse!

  • @wjrasmussen666
    @wjrasmussen666 2 роки тому

    what tool do you use to make these diagrams?

  • @yolowex6876
    @yolowex6876 Рік тому

    The first half was totally understandable. and the other half... also understandable

  • @robbylinson4868
    @robbylinson4868 Рік тому

    Why do we start at 9 after 0? would we not start at 7? how do we determine the order things are added to the queue

  • @Junglemunky
    @Junglemunky 7 місяців тому

    When adding the root node's neighbours to the queue, why does it not go in an order (e.g. smallest to largest or vice versa). Is this algorithm just trying to visit every node in the graph as quick as it can?

    • @WilliamFiset-videos
      @WilliamFiset-videos  7 місяців тому +1

      The algorithm will try to explore the entire graph in a breadth first manner. The order in which you add the roots neighbors to the queue doesn't matter for exploration purposes

    • @Junglemunky
      @Junglemunky 7 місяців тому

      @@WilliamFiset-videos right, thank you 👍

  • @huidihu7498
    @huidihu7498 3 роки тому

    you are a legend

  • @ahmetkarakartal9563
    @ahmetkarakartal9563 3 роки тому

    thank you

  • @toshinakaokubo1111
    @toshinakaokubo1111 4 роки тому

    u r the best

  • @aditya7955
    @aditya7955 6 років тому +5

    Awesome videos william.
    can you maybe discuss this problem.
    there are 'n' nodes and 'm' edges in a graph.
    each node may or may not contain certain number of a item.
    all nodes have same item but different number of that item.
    we have to go from source to destination in minimum time collecting 'k' number of this item.
    each edge is weighted,weights may or may not be same.
    there are no self loops.
    edges are bidirectional.

    • @WilliamFiset-videos
      @WilliamFiset-videos  6 років тому

      I'm not sure i'm going to cover that problem per se but can you provide a link to the problem?

  • @Leon-pn6rb
    @Leon-pn6rb 2 роки тому

    It was nice uptill midway, You didn't show, via diagram, the reconstruct path method logic. What happens after 3:00 ?

  • @0-sumequilibrium421
    @0-sumequilibrium421 4 роки тому

    great Video!

  • @petrotkach8757
    @petrotkach8757 3 роки тому

    Hello! Why don't you check neighbours for null here 5:42?

  • @laibamustafa108
    @laibamustafa108 3 роки тому +3

    Hi! Thanks for the explanation - I'm confused if the algorithm still works if the start node is the very first node in the queue. Because if you try to reconstruct the path using prev then it will exist because the first one in prev in null however that's the one we're looking for and path[0] won't be s. Not sure if I explained it well - hope you can clear my confusion. Thanks again!

  • @Jeffrey-qw9kf
    @Jeffrey-qw9kf 2 роки тому

    awesome

  • @matannagar
    @matannagar 3 роки тому

    How do we implement this on a weighted graph?

  • @rohitkinha3566
    @rohitkinha3566 Рік тому +1

    How do u create suuch presentation

  • @muhammadyameen4998
    @muhammadyameen4998 4 місяці тому

    tysm

  • @g3nko0
    @g3nko0 2 роки тому

    I didn't get it how path recreation in your code sample helps to find shortest path, looks like you just traverse it back as it was stored but there could be multiple ways to reach the same cell on the way, especially in case with diagonals and its not evident in your code how you address such issue. I am not seeing it in area about writing into the prev table and not at area where the previous node is read from it. So basically it should be dijkstra.

  • @nickharalampopoulos
    @nickharalampopoulos 4 роки тому +2

    Excellent video! Just a question. The prev array will contain ALL the visited nodes. I can not see how the reconstruct method will return the fastest path. Can anyone explain please?

    • @WilliamFiset-videos
      @WilliamFiset-videos  4 роки тому +2

      True, the prev array contains all nodes, but we're only reconstructing the shortest path between s and e. When we reconstruct the path we begin at e and add the node we used to get to e when we did the BFS (this is prev [e]), then we do the same thing and add prev[prev[e]] to shortest path and so on until we reach s. This will not visit all nodes -- except in the worst case (e.g your graph is a a straight line)

    • @gruuvy8067
      @gruuvy8067 4 роки тому +2

      @@WilliamFiset-videos Hi, this is a little bit late, but I am having trouble understanding how we know which node was the one that led to e, when "prev" seems to hold all the nodes?

    • @nmamano
      @nmamano 3 роки тому

      @@gruuvy8067 The BFS search creates what is called a "BFS tree". The root is the starting node s, and the edges in the tree represent that from a node we visited another node. "prev" maps each node to its parent in the BFS tree. By starting at a node e and following the sequence of parents in the BFS tree, we arrive at the start node s in the shortest number of steps.

    • @roberthoffenheim7861
      @roberthoffenheim7861 2 роки тому

      @@gruuvy8067 In the prev array, you start with searching for the value of the e'th (e is the ending node) index, this value is the node preceding e in the shortest path from s to e. Use that value as the next index to search for in the prev array and so on till you reach the start node s.

    • @sector1734
      @sector1734 2 роки тому

      @@roberthoffenheim7861 why not come to a grinding halt when you hit the end node in function 'solve' - instead of doing all nodes in the try, which seems inefficient

  • @siddharthshukla4338
    @siddharthshukla4338 2 роки тому

    YOU BEAUTIFUL MAN!

  • @parkerbelholland1037
    @parkerbelholland1037 2 роки тому

    Around 4:50 you mention "value at index i". Sorry, what is the index i? Just trying to understand

  • @anwarulbashirshuaib5673
    @anwarulbashirshuaib5673 3 роки тому

    5:27 shouldn't you add the node you just dequeued to the visited list, so that it won't get added to the queue again in the following iterations?

    • @siddharthshukla4338
      @siddharthshukla4338 2 роки тому

      We have marked it as visited before starting the while loop

  • @akashkakumani4036
    @akashkakumani4036 5 років тому

    Just a question, why not make prev a hash table? and then we can even get rid of visited. If the presence of a node is in the prev table, then it's already been visited.

    • @WilliamFiset-videos
      @WilliamFiset-videos  5 років тому

      When you have a fixed number of elements which can be indexed an array serves as a faster hashmap with builtin indexing.

    • @thefreakingmindistaken
      @thefreakingmindistaken 4 роки тому

      @@WilliamFiset-videos Cant we do this. Create a Hashmap. then put something like map.put(s, new LinkedList) and then track all visited in an Array. In this case we will be simply traversing. A bit of generic approach.

  • @user-kb9tz7pp9y
    @user-kb9tz7pp9y 2 роки тому

    Thnxxx!!!!

  • @curiousmind2330
    @curiousmind2330 Рік тому

    Can you please help me...which tool you used for making graphs....I have to make them for my project and your diagrams are very clear 😀

  • @scienceboy20814
    @scienceboy20814 4 роки тому +8

    How do you know that you are following the shortest path when you reconstruct the path from e? What if there was more than one path to e? Wouldn't the last path to reach e be the one that is set in prev?

    • @silviogames
      @silviogames 4 роки тому +3

      since e is put into the visited array, prev would not be overwritten. I also wondered why always the shortest path is found but since the algorithm is filling the search field from s to e, as soon as e is reached, it has to be the shortest path. all resulting paths are parallely searched on step further so the shortest path to e will always emerge.

    • @An-wd9kk
      @An-wd9kk 3 роки тому +1

      @@silviogames So I interpret your explanation as that the FIRST path being found is the SHORTEST path. Is this correct? And this is achieved by the layering and queueing concept of BFS. The path found first is the path found at the lowest layer (closest to the source node).

    • @silviogames
      @silviogames 3 роки тому

      @@An-wd9kk yeah. lets assume there exist 3 paths to the goal but the algorithm will always move one step at a time so the first that wins has to be the shortest. the others will either be same length or longer

    • @An-wd9kk
      @An-wd9kk 3 роки тому

      @@silviogames yes thank you for your answer.

    • @emin6626
      @emin6626 Рік тому +1

      @@silviogames I was trying to understand since two days and you exactly saved me. Thanks for explanation.

  • @kirkchu7304
    @kirkchu7304 3 роки тому

    is the prev array like parents?

  • @oleksandrtkach416
    @oleksandrtkach416 3 роки тому

    Complexity O(V + E) for directed graph, right? For undirected O(V + 2E). Correct me if I am wrong)