Add my own implementation of Dijkstra's algorithm.

The advantage of this implementation is that we can simultaneously
store multiple predecessors (corresponding to multiple shortest
paths) and count the number of shortest paths from the source node
to every other node. This will be particularly useful in the
calculation of betweenness and closeness centrality in the
WeightedGraphAnalyzer class. This implementation seems to be
pretty fast.

I will need to rethink NodeBetweennessInfo because when I use it
for BFS, the distance variable is an int, but when I use it for
Dijkstra, distance is a double. For now, I have two different
variables, distance and distanceDouble.
Make nodeBetweenness final.