What's the difference? g[at] seems more confusing to me as the letter "g" does not really mean anything and one has to think about what it is whereas "graph" clearly conveys what the variable is about.
great video. jutst a gotacha for future learners, the dfs findComponents algo only works well for undirected graphs and will give weird results with directed graphs. ex. in directed graphs if you take the picture 7:25 the for loop first sees node#2. however there is no path from 2 to 3 even tho they are in the same component. so instead of the answer which is 5 you get 6 Excellent video tho and thanks for the explanation
I think you confuse reachability with connectedness. Two nodes can be connected but unreachable in directed graph. In order to ensure the connected components you need to loop over each node and see if a path exists which connects all the components and there can be a scenario where nodes would be connected but you wont have a path. In order to know the graph is connected or not, it need to be undirected.
You can reverse the order of calling the neighbours in this implementation, so the output will the same as You would use stack dfs algorithm - the one that uses stack instead of recursion. Because if You add neighbours to the stack the last one will be called first since it will be popped first.
Thank you very much for such an amazing video series, the content of the video is so organized that whenever I think of some scenario that scenarios explanation comes to next. Amazing :)
For the pseudo code: for next in neighbors should have an additional line below it that goes like this: if visited[next] = false In Python he did write it correctly though.
It will give 6 not 5 as the answer because in for loop we visit each node from 0 to n so when i=2 it will visit all the neighbours of 2 but not 3 because there is no outgoing edge to 3.so when i=3 it will also count it as a individual node. And hence the number of connected components would be 6 not 5. Correct me if i am wrong.
"the nice thing about dfs is that is really easy to code". THE AMOUNT OF ITERATORS, POINTERS AND VECTORS INSIDE THE GRAPH, VERTEX AND EDGE CLASS SAY OTHERWISE!! Sometimes I really hate c++
Hey are you sure DFS can be used to find the minimum spanning tree? Pretty sure that it wont give a linear time solution. Prims or Kruskals will probably be better suited for this
In the pseudo-code for DFS, the variable g is initialized to be the adjacency list representing the graph. However, in the dfs function, this variable is called "graph". Or am I missing something? Also, n is initialized to be |V| but this variable is then never actually used, other than implicitly to initialize the "visited" list of booleans.
in the beginning you explain that after the first traversal the dfs is over but you didn't visit the #12 node, dfs beside of coloring from white to gray to black also uses a counter to mark in each node when was that node firs found and when did the algorithm leave the node, you finished the traversal on the big graph but dfs start another traversal , you should have visit 12 also and mark it as a second component of the graph meaning the number of nils in the graph is 2
The animation doesn't visit node 12 because it's trivial, but for completeness sake it should. When I said the dfs was finished I was referring to the large component.
Just to clarify this is the python code I wrote using the graph example given in video. Is it okay? g = {0:[1,9],9:[0,8],1:[0,8],8:[1,9,7],7:[8,10,3],10:[7,11],11:[7,10],6:[5,7],5:[6,3],3:[2,4,5],2:[3],4:[3]} n = 12 visited = n*[False] def dfs(at): at = at[0] if visited[at]: return visited[at] = True neighbours = g[at] for nex in neighbours: dfs([nex]) start_node = g[0] dfs(start_node)
It shouldn't matter. The idea is to give every component a unique id at the end of the day. However, labeling components starting at 1 instead of 0 is handy for debugging because by default the 'components' array has all values initialized to 0 so it's hard to tell whether a node was marked by the DFS method or simply initialized that way.
Vertices could be computers, websites or programs. Edges then could be network connections, website links etc etc. I'm not a computer scientist but I do know that edges and vertices can be anything as long as they are connected or linked in some way in a system.
Think of edges as routes and vertices as cities. Check this awesome playlist about Graph Theory from the beginning ru-vid.com/group/PLDV1Zeh2NRsDGO4--qE8yH72HFL1Km93P
Can I ask something, I know you entered icpc, and I really want to get ready when I'm entering it, so can you tell what I need to know about number theories for competitive programming, thank you very much