Merge Graph and DiGraph in the same struct

* Use Directed attribute to determine the nature of the Graph
* Update search algorithms to take Graphs
* Add mandatory weight attribute to Edge