contents summary exercises references graph algorithms definitions representation of graphs topological sort shortest-path algorithms unweighted shortest paths dijkstra' algorithm graphs with negative edge costs acyclic graphs all-pairs shortest path shortest path example network flow problems simple maximum-flow algorithm minimum spanning tree prim' algorithm kruskal' algorithm applications of depth-first search undirected graphs biconnectivity euler circuits directed graphs finding strong components introduction to np-completeness easy vs hard the class np np-complete problems summary exercises references algorithm design techniques greedy algorithms simple scheduling problem huffman codes approximate bin packing divide and conquer running time of divide-and-conquer algorithms closest-points problem