Actually you'll also get caustics on the bottom of pool with bidir path tracing, but after a lot longer time than with photon mappings.
So some technical stuff:
Light tracing - tracing photon from light, bouncing it around and waiting till it strikes camera plane. (can be optimized by testing each light path point against camera and accumulate energy)
Path tracing - tracing photon from eye and waiting till it strikes light (can be optimized by testing each path point whether it hits all of lights and accumulate energy)
Bidirectional path tracing - first you perform light tracing, remembering all light path points with their energy. Then you perform path tracing from camera and test against all light tracing points.
See some images here - http://www.cescg.org/CESCG97/csebfalvi/node8.html
Thats the basic idea on this.
You can further extend algorithms with Importance sampling (which greatly helps in number of steps to finish the computation) - with good Importance sampling, one can even compute caustics in just few steps.
Of course you can migrate all the stuff to GPU and do it at interactive speeds