I sort of understand how the push-relabel algorithm works. As per my understanding, it works by maintaining a preflow, however this results in there being excess flow at some nodes. Then, on a node with excess, the push operation will either push flow forward if it can, or backwards if it has reached capacity. However, if there are no adjacent nodes of a lower height, it will relabel the node to have a greater height.
I can see how this works on a normal graph. So why even introduce the residual graph? In every explanation of the algorithm I see, these operations are performed on the residual graph, which is confusing to me.