Home > Store

Algorithms in C++ Part 5: Graph Algorithms, 3rd Edition

Register your product to gain access to bonus material or receive a coupon.

Algorithms in C++ Part 5: Graph Algorithms, 3rd Edition

Best Value Purchase

Book + eBook Bundle

  • Your Price: $60.79
  • List Price: $87.98
  • Includes EPUB, MOBI, and PDF
  • About eBook Formats
  • This eBook includes the following formats, accessible from your Account page after purchase:

    ePub EPUB The open industry format known for its reflowable content and usability on supported mobile devices.

    MOBI MOBI The eBook format compatible with the Amazon Kindle and Amazon Kindle applications.

    Adobe Reader PDF The popular standard, used most often with the free Adobe® Reader® software.

    This eBook requires no passwords or activation to read. We customize your eBook by discreetly watermarking it with your name, making it uniquely yours.

More Purchase Options


  • Your Price: $50.99
  • List Price: $59.99
  • Usually ships in 24 hours.

eBook (Watermarked)

  • Your Price: $23.79
  • List Price: $27.99
  • Includes EPUB, MOBI, and PDF
  • About eBook Formats
  • This eBook includes the following formats, accessible from your Account page after purchase:

    ePub EPUB The open industry format known for its reflowable content and usability on supported mobile devices.

    MOBI MOBI The eBook format compatible with the Amazon Kindle and Amazon Kindle applications.

    Adobe Reader PDF The popular standard, used most often with the free Adobe® Reader® software.

    This eBook requires no passwords or activation to read. We customize your eBook by discreetly watermarking it with your name, making it uniquely yours.




    • Copyright 2002
    • Dimensions: 7-3/4" x 9-1/4"
    • Pages: 528
    • Edition: 3rd
    • Book
    • ISBN-10: 0-201-36118-3
    • ISBN-13: 978-0-201-36118-6

    Graph algorithms are critical for a wide range of applications, including network connectivity, circuit design, scheduling, transaction processing, and resource allocation. The latest in Robert Sedgewick's classic series on algorithms, this is the field's definitive guide to graph algorithms for C++. Far more than a "revision," this is a thorough rewriting, five times as long as the previous edition, with a new text design, innovative new figures, more detailed descriptions, and many new exercises -- all designed to dramatically enhance the book's value to developers, students, and researchers alike. The book contains six chapters covering graph properties and types, graph search, directed graphs, minimal spanning trees, shortest paths, and networks -- each with diagrams, sample code, and detailed descriptions intended to help readers understand the basic properties of as broad a range of fundamental graph algorithms as possible. The basic properties of these algorithms are developed from first principles; discussion of advanced mathematical concepts is brief, general, and descriptive, but proofs are rigorous and many open problems are discussed. Sedgewick focuses on practical applications, giving readers all the information and real (not pseudo-) code they need to confidently implement, debug, and use the algorithms he covers. (Also available: Algorithms in C++: Parts 1-4, Third Edition, ISBN: 0-201-35088-2).


    Source Code

    Code for Algorithms in C++, Third Edition, Part 5


    Click below for Supplements related to this title:


    Web Resources

    Click below for Web Resources related to this title:
    Author's Web Site

    Author's Site

    Click for the Author's Web Site related to this title.

    Sample Content

    Table of Contents

    17. Graph Properties and Types.


    Graph ADT.

    Adjacency-Matrix Representation.

    Adjacency-Lists Representation.

    Variations, Extensions, and Costs.

    Graph Generators.

    Simple, Euler, and Hamilton Paths.

    Graph-Processing Problems.

    18. Graph Search.

    Exploring a Maze.

    Depth-First Search.

    Graph-Search ADT Functions.

    Properties of DFS Forests.

    DFS Algorithms.

    Separability and Biconnectivity.

    Breadth-First Search.

    Generalized Graph Search.

    Analysis of Graph Algorithms.

    19. Digraphs and DAGs.

    Glossary and Rules of the Game.

    Anatomy of DFS in Digraphs.

    Reachability and Transitive Closure.

    Equivalence Relations and Partial Orders.


    Topological Sorting.

    Reachability in DAGs.

    Strong Components in Digraphs.

    Transitive Closure Revisited.


    20. Minimum Spanning Trees.


    Underlying Principles of MST Algorithms.

    Prim's Algorithm and Priority-First Search.

    Kruskal's Algorithm.

    Boruvka's Algorithm.

    Comparisons and Improvements.

    Euclidean MST.

    21. Shortest Paths.

    Underlying Principles.

    Dijkstra's algorithm.

    All-Pairs Shortest Paths.

    Shortest Paths in Acyclic Networks.

    Euclidean Networks.


    Negative Weights.


    22. Network Flow.

    Flow Networks.

    Augmenting-Path Maxflow Algorithms.

    Preflow-Push Maxflow Algorithms.

    Maxflow Reductions.

    Mincost Flows.

    Network Simplex Algorithm.

    Mincost-Flow Reductions.


    References for Part Five.

    Index. 0201361183T12172001


    Graphs and graph algorithms are pervasive in modern computing applications. This book describes the most important known methods for solving the graph-processing problems that arise in practice. Its primary aim is to make these methods and the basic principles behind them accessible to the growing number of people in need of knowing them. The material is developed from first principles, starting with basic information and working through classical methods up through modern techniques that are still under development. Carefully chosen examples, detailed figures, and complete implementations supplement thorough descriptions of algorithms and applications.


    This book is the second of three volumes that are intended to survey the most important computer algorithms in use today. The first volume (Parts 1-4) covers fundamental concepts (Part 1), data structures (Part 2), sorting algorithms (Part 3), and searching algorithms (Part 4); this volume (Part 5) covers graphs and graph algorithms; and the (yet to be published) third volume (Parts 6-8) covers strings (Part 6), computational geometry (Part 7), and advanced algorithms and applications (Part 8).

    The books are useful as texts early in the computer science curriculum, after students have acquired basic programming skills and familiarity with computer systems, but before they have taken specialized courses in advanced areas of computer science or computer applications. The books also are useful for self-study or as a reference for people engaged in the development of computer systems or applications programs because they contain implementations of useful algorithms and detailed information on these algorithms' performance characteristics. The broad perspective taken makes the series an appropriate introduction to the field.

    Together the three volumes comprise the Third Edition of a book that has been widely used by students and programmers around the world for many years. I have completely rewritten the text for this edition, and I have added thousands of new exercises, hundreds of new figures, dozens of new programs, and detailed commentary on all the figures and programs. This new material provides both coverage of new topics and fuller explanations of many of the classic algorithms. A new emphasis on abstract data types throughout the books makes the programs more broadly useful and relevant in modern object-oriented programming environments. People who have read previous editions will find a wealth of new information throughout; all readers will find a wealth of pedagogical material that provides effective access to essential concepts.

    These books are not just for programmers and computer science students. Everyone who uses a computer wants it to run faster or to solve larger problems. The algorithms that we consider represent a body of knowledge developed during the last 50 years that is the basis for the efficient use of the computer for a broad variety of applications. From N-body simulation problems in physics to genetic-sequencing problems in molecular biology, the basic methods described here have become essential in scientific research; and from database systems to Internet search engines, they have become essential parts of modern software systems. As the scope of computer applications becomes more widespread, so grows the impact of basic algorithms, particularly the fundamental graph algorithms covered in this volume. The goal of this book is to serve as a resource so that students and professionals can know and make intelligent use of graph algorithms as the need arises in whatever computer application they might undertake.


    This book, Algorithms in C++, Third Edition, Part 5: Graph Algorithms, contains six chapters that cover graph properties and types, graph search, directed graphs, minimal spanning trees, shortest paths, and networks. The descriptions here are intended to give readers an understanding of the basic properties of as broad a range of fundamental graph algorithms as possible.

    You will most appreciate the material here if you have had a course covering basic principles of algorithm design and analysis and programming experience in a high-level language such as C++, Java, or C. Algorithms in C++, Third Edition, Parts 1-4 is certainly adequate preparation. This volume assumes basic knowledge about arrays, linked lists, and ADT design, and makes use of priority-queue, symbol table, and union-find ADTs--all of which are described in detail in Parts 1-4 (and in many other introductory texts on algorithms and data structures).

    Basic properties of graphs and graph algorithms are developed from first principles, but full understanding often can lead to deep and difficult mathematics. Although the discussion of advanced mathematical concepts is brief, general, and descriptive, you certainly need a higher level of mathematical maturity to appreciate graph algorithms than you do for the topics in Parts 1-4. Still, readers at various levels of mathematical maturity will be able to profit from this book. The topic dictates this approach: some elementary graph algorithms that should be understood and used by everyone differ only slightly from some advanced algorithms that are not understood by anyone. The primary intent here is to place important algorithms in context with other methods throughout the book, not to teach all of the mathematical material. But the rigorous treatment demanded by good mathematics often leads us to good programs, so I have tried to provide a balance between the formal treatment favored by theoreticians and the coverage needed by practitioners, without sacrificing rigor.

    Use in the Curriculum

    There is a great deal of flexibility in how the material here can be taught, depending on the taste of the instructor and the preparation of the students. The algorithms described have found widespread use for years, and represent an essential body of knowledge for both the practicing programmer and the computer science student. There is sufficient coverage of basic material for the book to be used in a course on data structures and algorithms, and there is sufficient detail and coverage of advanced material for the book to be used for a course on graph algorithms. Some instructors may wish to emphasize implementations and practical concerns; others may wish to emphasize analysis and theoretical concepts.

    For a more comprehensive course, this book is also available in a special bundle with Parts 1-4; thereby instructors can cover fundamentals, data structures, sorting, searching, and graph algorithms in one consistent style. A set of slide masters for use in lectures, sample programming assignments, interactive exercises for students, and other course materials may be found by accessing the book's home page.

    The exercises--nearly all of which are new to this edition--fall into several types. Some are intended to test understanding of material in the text, and simply ask readers to work through an example or to apply concepts described in the text. Others involve implementing and putting together the algorithms, or running empirical studies to compare variants of the algorithms and to learn their properties. Still other exercises are a repository for important information at a level of detail that is not appropriate for the text. Reading and thinking about the exercises will pay dividends for every reader.

    Algorithms of Practical Use

    Anyone wanting to use a computer more effectively can use this book for reference or for self-study. People with programming experience can find information on specific topics throughout the book. To a large extent, you can read the individual chapters in the book independently of the others, although, in some cases, algorithms in one chapter make use of methods from a previous chapter.

    The orientation of the book is to study algorithms likely to be of practical use. The book provides information about the tools of the trade to the point that readers can confidently implement, debug, and put to work algorithms to solve a problem or to provide functionality in an application. Full implementations of the methods discussed are included, as are descriptions of the operations of these programs on a consistent set of examples. Because we work with real code, rather than write pseudo-code, the programs can be put to practical use quickly. Program listings are available from the book's home page.

    Indeed, one practical application of the algorithms has been to produce the hundreds of figures throughout the book. Many algorithms are brought to light on an intuitive level through the visual dimension provided by these figures.

    Characteristics of the algorithms and of the situations in which they might be useful are discussed in detail. Connections to the analysis of algorithms and theoretical computer science are developed in context. When appropriate, empirical and analytic results are presented to illustrate why certain algorithms are preferred. When interesting, the relationship of the practical algorithms being discussed to purely theoretical results is described. Specific information on performance characteristics of algorithms and implementations is synthesized, encapsulated, and discussed throughout the book.

    Programming Language

    The programming language used for all of the implementations is C++. The programs use a wide range of standard C++ idioms, and the text includes concise descriptions of each construct.

    Chris Van Wyk and I developed a style of C++ programming based on classes, templates, and overloaded operators that we feel is an effective way to present the algorithms and data structures as real programs. We have striven for elegant, compact, efficient, and portable implementations. The style is consistent whenever possible, so that programs that are similar look similar.

    A goal of this book is to present the algorithms in as simple and direct a form as possible. For many of the algorithms, the similarities remain regardless of which language is used: Dijkstra's algorithm (to pick one prominent example) is Dijkstra's algorithm, whether expressed in Algol-60, Basic, Fortran, Smalltalk, Ada, Pascal, C, C++, Modula-3, PostScript, Java, or any of the countless other programming languages and environments in which it has proved to be an effective graph-processing method. On the one hand, our code is informed by experience with implementing algorithms in these and numerous other languages (a C version of this book is also available, and a Java version will appear soon); on the other hand, some of the properties of some of these languages are informed by their designers' experience with some of the algorithms and data structures that we consider in this book. In the end, we feel that the code presented in the book both precisely defines the algorithms and is useful in practice.
    Robert Sedgewick

    C++ Consultant's Preface

    Bob Sedgewick and I wrote many versions of most of these programs in our quest to implement graph algorithms in clear and natural programs. Because there are so many kinds of graphs and so many different questions to ask about them, we agreed early on not to pursue a single class scheme that would work across the whole book. Remarkably, we ended up using only two schemes: a simple one in Chapters 17 through 19, where the edges of a graph are either present or absent; and an approach similar to STL containers in Chapters 20 through 22, where more information is associated with edges.

    C++ classes offer many advantages for presenting graph algorithms. We use classes to collect useful generic functions on graphs (like input/output). In Chapter 18, we use classes to factor out the operations common to several different graph-search methods. Throughout the book, we use an iterator class on the edges emanating from a vertex so that the programs work no matter how the graph is stored. Most important, we package graph algorithms in classes whose constructor processes the graph and whose member functions give us access to the answers discovered. This organization allows graph algorithms to readily use other graph algorithms as subroutines--see, for example, Program 19.13 (transitive closure via strong components), Program 20.8 (Kruskal's algorithm for minimum spanning tree), Program 21.4 (all shortest paths via Dijkstra's algorithm), Program 21.6 (longest path in a directed acyclic graph). This trend culminates in Chapter 22, where most of the programs are built at a higher level of abstraction, using classes that are defined earlier in the book.

    For consistency with Algorithms in C++, Third Edition, Parts 1-4, our programs rely on the stack and queue classes defined there, and we write explicit pointer operations on singly-linked lists in two low-level implementations. We have adopted two stylistic changes from Parts 1-4: Constructors use initialization rather than assignment and we use STL vectors instead of arrays. Here is a summary of the STL vector functions we use in our programs:

    • The default constructor creates an empty vector.
    • The constructor vec(n) creates a vector of n elements.
    • The constructor vec(n, x) creates a vector of n elements each initialized to the value x.
    • Member function vec.assign(n, x) makes vec a vector of n elements each initialized to the value x.
    • Member function vec.resize(n) grows or shrinks vec to have capacity n.
    • Member function vec.resize(n, x) grows or shrinks vec to have capacity n and initializes any new elements to the value x.

    The STL also defines the assignment operator, copy constructor, and destructor needed to make vectors first-class objects.

    Before I started working on these programs, I had read informal descriptions and pseudocode for many of the algorithms, but had only implemented a few of them. I have found it very instructive to work out the details needed to turn algorithms into working programs, and fun to watch them in action. I hope that reading and running the programs in this book will also help you to understand the algorithms better.
    Christopher Van Wyk



    Abstract transitive closure, 174-175, 216-220
    Active vertex, 411
    Acyclic graph. See Digraph; Directed acyclic graph (DAG)
    Acyclic network, 313-321, 334-335
       maxflow, 427-429
    Adjacency-lists representation, 31-35
       DFS, 90, 95, 102
       digraphs, 36-37, 153, 155, 179
       edge connectivity, 115-116
       find/remove edge, 40
       flow networks, 379
       performance, 33-35, 37-40, 145-146
       removing vertices, 41
       standard adjacency-lists DFS, 97, 161
       transitive closure, 174
       weighted graphs/networks, 37, 230, 235-238, 278
    Adjacency-matrix representation, 25-30
       DFS, 90, 95, 101
       digraphs, 36-37, 153, 154-155, 169-172, 176, 179
       flow networks, 379
       linear-time algorithm, 59
       performance, 29-30, 37-40, 144-146
       removing vertices, 41
       standard adjacency-matrix DFS, 97, 161
       weighted graphs/networks, 37, 230, 233-238, 278
    Adjacent vertices, 9
    ADT, graph. See Graph ADT
    Airline route, 283
    All-pairs shortest path, 281, 304-311
       acyclic networks, 318-320
       BFS, 127-129
       negative weights, 356-360
       path relaxation, 288-290
       and transitive closure, 175, 328-329
    Arbitrage, 348-349
    Arbitrary weight, 229
    Arc, 8, 14
    Articulation point, 117-118
    Assignment problem, 74, 476-477
    A* algorithm, 325
    Augmenting-path method, 382-407
       cycle canceling, 451
       longest augmenting path, 396
       maximum-capacity, 394, 399-401, 405-406
       network simplex algorithm, 460-461
       performance, 393, 395-406, 434-436
       and preflow-push, 411
       random flow networks, 402-404
       randomized, 402
       shortest augmenting path, 393-394, 398-399, 405-407
       stack-based, 400

    Back edge, 99, 113-115, 161-165, 202-203
    Back link, 99-100
    Bellman-Ford algorithm, 350-356, 358-360, 447
    BFS tree, 124-129
    Binary DAG, 188-190
    Binary decision diagram (BDD), 189
    Binary tree, 188-190
    Bioconnectivity, 117-119
    Bipartite graph, 13, 110-111
    Bipartite matching, 73-74, 433-436, 476, 482
    Boolean matrix multiplication, 169-172, 176-177
    Boruvka's algorithm, 244, 263-267
    Breadth-first search (BFS), 81-82, 121-130
       and DFS, 127-134
       forest, 125
       fringe size, 137-138
       PFS, 253, 302
    Bridge, 113-117
    Bridges of Konigsberg problem, 62-64

    Call, program, 5
    Capacity, flow, 372, 375
       st-cut, 385
       vertex-capacity constraints, 426
    change priority operation, 253
    Circuit, 4
    Circulation, flow network, 377-378, 429
       augmenting-paths, 391
       cycle canceling, 449
       DFS, 96
       flow networks, 379, 432
       network simplex algorithm, 466-467
       weighted graphs, 233-236
       see also Graph ADT
    Clique, 12, 75
    Colorability problem, 75
       two-coloring, 110-111
    Communications network, 367-369
    Complement, 12
    Complete graph, 12
    Computer science, 365
    Connection, 3
    Connectivity, 11-12
       bioconnectivity, 117-119
       digraphs, 158
       edge, 438-439
       equivalence relations, 184
       general connectivity, 74, 119
       k-connected graph, 119
       maxflow, 437-438
       random, 141-144
       simple connectivity, 72, 106-109
       st-connectivity, 119
       strong connectivity, 72, 156-158, 205
       vertex connectivity, 119, 438
    Construct operation, 262
    Constraint, 186
    Cost, 227, 372, 443
       convex/nonlinear, 483
       edge, 474
       flow, 443
       negative, 446-447
       reduced, 454-457
       see also Performance; Weighted graph
    Critical edge, 398-399
    Cross edge, 161-162, 202, 204
    Crossing edge, 241, 385
    Cut, 241
       mincut, 386-387
       property, 240-241, 245
       set, 385
       st-cut, 0-427-428, 385-387
       vertex, 117-118
    Cut problem, 369-370, 385-386
    Cycle, 10-11
       DFS, 105-106
       directed, 14, 155, 162-165
       even, 74, 224
       flow networks, 377-378, 427
       MSTs, 240-244
       negative, 279-280, 348-350, 446-454
       odd, 110
       property, 242-243
    Cycle-canceling algorithm, 372, 447-452
       see also Network simplex algorithm
    Cyclic path, 10, 156, 477-478

    DAG. See Directed acyclic graph (DAG)
    de Bruijn graph, 53
    Decrease key operation, 255, 268-269, 297
    Degrees-of-separation graph, 53
    Delauney triangulation, 274
    Dense graph, 13, 29-30
    Depth-first search (DFS), 81-82, 87-91
       and BFS, 127-134
       classes, 96
       cycle detection, 105-106
       digraphs, 160-168
       fringe size, 137-138
       PFS, 253
       running time, 95-96
       simple connectivity, 106-109
       simple path, 57-59, 106
       spanning forest, 93, 110
       standard adjacency representations, 97, 161
       strong components algorithms, 207-214
       topological sorting, 193-195, 201-204
       transitive closure, 177-179
       tree links, 99-100
       and Tremaux exploration, 87-90
       two-colorability, 110-111
       two-way Euler tour, 66, 109
       and union-find, 108-109
       vertex search, 109-110
       see also DFS tree
    Destination vertex, 14
    DFS forest, 98-103, 124-125
       DAGs, 194
       digraphs, 161-162, 164
       spanning forest, 110
    DFS tree, 90, 98-103
       bridges, 113-117
       diagraphs, 161-162
    d-heap, 269, 271-272
    Diameter, network, 304
    Difference constraints, 332-336, 338, 347
    Digraph, 14-15, 149-224
       adjacency-lists representation, 36-37, 153, 155, 179
       adjacency-matrix representation, 36-37, 153, 154-155, 169-172, 176, 179
       connectivity, 158, 438
       decomposing, 166
       defined, 152
       DFS in, 160-168
       directed cycle detection, 162-166, 187
       directed path, 152, 155
       edge direction, 149-150
       even cycles, 74
       grid, 152
       isomorphism, 150
       map, 154
       random, 220
       and relations, 182-183
       reverse, 154-155
       running time, 221-222
       single-source reachability, 166-167
       strong components, 157-158, 205-214
       strongly connected, 72, 156-158, 205
       transitive closure, 169-180, 216-220
       and undirected graphs, 153, 155-162, 165-167, 179-180
       uniconnected, 224
       weighted, 277-278
    Dijkstra's algorithm, 256, 293-302
       acyclic networks, 320
       all-pairs shortest paths, 305-307
       Euclidean networks, 323-326
       negative weights, 349, 354-360
       and Prim's algorithm, 294-296
    Directed acyclic graph (DAG), 14, 150, 186-204
       binary, 188-190
       defined, 155
       detection, 162-165, 187
       dominators, 223
       kernel, 157, 216-220
       longest path, 199
       partial orders, 184-185
       scheduling problem, 186-187
       sink/source, 195-199
       strong components, 157
       topological sorting, 187, 191-199
       transitive closure, 201-204
       weighted, 313-321
    Directed cycle, 14, 155, 162-165, 187
    Directed graph. See Digraph; Directed acyclic graph (DAG)
    Directed path, 72, 152, 155, 224
    Disjoint paths, 11, 117
    Distances matrix, 289, 306, 360
    Distribution network, 444-445
    Distribution problem, 368, 430, 444-445, 475
    Dominator, 223
    Down link, 99-100, 161-162, 202-204
    Dummy edge, 447-451, 454-455, 472
    Dummy vertex, 376-377
    Dynamic algorithm, 21-22, 50
    Dynamic reachability, 223

    Edge, 7-10
       back, 99, 113-115, 161-165, 202-203
       backward/forward, 383-384
       class, 379
       connectivity, 438-439
       costs, 474
       critical, 398-399
       cross, 161-162, 202, 204
       crossing, 241, 385
       directed, 14
       disjoint, 11, 117, 437
       down, 99-100, 161-162, 202-204
       dummy, 447-451, 454-455, 472
       eligible, 412, 455-457, 462-468
       flows, 375
       incident, 9
       marking vertices, 93
       parallel, 8, 18, 27, 34, 47, 237, 278
       pointers, 232, 235-237, 277-278, 432
       random, 47
       relaxation, 286-287, 292, 323
       separation, 112
       tree, 99, 113-115, 161-162, 202
       uncapacitated, 380
       vector-of-edges, 24, 37
    Edge data type, 17, 37, 231-232, 379, 390
    Edge-based preflow-push algorithm, 413-414
    Edge-connected graph, 113, 117, 438-439
    Edge-separable graph, 112
    Edmonds, J., 393
    Eligible edge, 412, 455-457, 462-468
    Enumeration, graph, 150-151
    Equal weights, 228-229
    Equivalence class, 183
    Equivalence relation, 183
    Equivalent problems, 328
    Erdos, P., 144
    Euclidean graph, 10
       flow networks, 402-404
       MSTs, 274-276
       neighbor graphs, 49
       networks, 322-326
    Euclidean heuristic, 324-326
    Euler path, 62-68
       directed, 224
       mail carrier, 477-478
       two-way Euler tour, 109
    Even cycle, 74, 224
    Excess, vertex, 411
    Existence problem, 75-76

    Fat interface, 39
    Feasible flow, 410, 430-432, 444
    Feasible spanning tree, 453-455
    Feedback vertex set, 224
    Fibonacci computation, 188, 268
    FIFO queue, 123-125, 132-138
       PFS, 302
       preflow-push, 416-420
       topological sort, 197-199
    Find edge operation, 40-41
    Flow cost, 443
    Flow network, 15, 367-486
       augmenting-flow method, 382-407
       backward/forward edges, 383-384
       capacities, 372, 375, 385, 426
       circulation, 377-378, 429
       cut problems, 369-370, 385-386
       defined, 375
       distribution problems, 368, 430, 444-445, 475
       equilibrium, 376-377
       flows, 372, 375
       inflow/outflow, 375-377
       matching problems, 369, 433-436, 476, 482
       maxflow-mincut theorem, 385-387
       model, 373-374
       network simplex algorithm, 372, 453-470, 479
       preflow-push method, 410-423
       random, 402-404
       reductions, 367, 406, 425-440
       representations, 379
       residual, 388-391, 412, 417, 446, 453
       st-network, 375-377, 429-430
       value, 375-377
       see also Maxflow problem; Mincost flow problem; Network
    Floyd's algorithm, 176, 290, 304, 307-311
       negative weights, 349-351, 354
    Ford, L. R., 382
    Ford-Fulkerson method. See Augmenting-path method
    Forest, 12
       BFS, 125
       Boruvka's algorithm, 264
       DFS, 98-103, 109, 124-125, 161-162, 164, 194
       Kruskal's algorithm, 258
       spanning, 109
       see also DFS tree; Tree
    Four-color theorem, 76
    Fringe, 131-138, 296
       Prim's algorithm, 251-256
       priority queue, 393
    Fulkerson, D. R., 382
    Function call graph, 50-52

    Gabow's algorithm, 206, 211-214
    General connectivity, 74, 119
    Generalized queue, 416, 418
    Geometric algorithm, 275-276
    Goldberg, A., 410
    Graph, 3-73
       applications, 4-5
       bipartite, 13, 110-111
       complete, 12
       connected, 11-12
       de Bruijn, 53
       defined, 7
       degrees-of-separation, 53
       dense/sparse, 13, 29-30
       directed/undirected, 14-15
       edge-connected/edge-separable, 112-113, 117
       Euclidean, 10
       function call, 50-52
       interval, 53
       isomorphic, 10, 29
       multigraph, 8
       neighbor, 49
       planar, 9, 73
       random, 47-48
       simple, 8
       static, 21-22
       subgraph, 9
       transaction, 49-50
       see also Digraph; Directed acyclic graph (DAG); Undirected graph; Weighted graph
    Graph ADT, 16-24, 39
       adjacency-lists representation, 31-35
       adjacency-matrix representation, 25-30
       all-pairs shortest paths, 304-305
       connectivity interface, 21-22
       constructor, 18
       equivalence relations, 184
       graph-search functions, 91-97
       iterator, 18-20
       show function, 20
       symbol table, 50
       vertex degrees, 38
       weighted graphs, 230-239
       see also Class
    Graph search, 81-147
       ADT functions, 91-97
       algorithm analysis, 140-146
       bioconnectivity, 117-119
       generalized, 131-138
       Hamilton tour, 60
       maze exploration, 82-86
       priority-first search, 251-256, 296-302, 323, 392-393
       randomized, 136-138
       separability, 112-117
       simple path, 57-59, 61, 106
       see also Breadth-first search (BFS); Depth-first search (DFS)
    Graph-processing problem, 70-79
       client, 19, 23
       degree of difficulty, 71, 77-79
       existence, 75-76
       intractable, 75
       NP-hard, 75, 77, 339-340
       tractable, 72
    Grid digraph, 152

    Hamilton path, 59-62, 224, 339-340
    Height function, 412-415
    Highest-vertex preflow-push, 420
    Hypertext, 4

    Immediate dominator, 223
    Incident edge, 9
    Indegree, 14, 153-154, 197
    Independent set problem, 75
    Indexing function, 51
    Induced subgraph, 9
    Infeasible problem, 336
    Inflow, 375-377
    Inheritance, 39
    Initial height function, 413
    Integer weights, 379-380
    Interface, graph ADT, 16-24, 39
    Intersection, 82
    Interval graph, 53
    Intractable problem, 75, 342
    Irreflexive relation, 183
    Isomorphic graphs, 10, 29, 77, 150
    Item, 3

    Jarnik's algorithm, 256
    Job placement, 369, 476
    Job scheduling, 4, 150, 186-187
       negative cycles, 348-350
       shortest paths, 332-338, 344
       see also Topological sorting
    Johnson, D., 268
    Johnson's algorithm, 360
    Karp, R., 206, 393
    k-connected graph, 119
    Kernel DAG, 157, 216-220
    k-neighbor graph, 49
    Konigsberg, bridges of, 62-64
    Kosaraju's algorithm, 206-208
    Kruskal's algorithm, 243-244, 258-263, 268
    Kuratowski's theorem, 73

    Least common ancestor (LCA), 459-460
    Length, path, 11
    Library programming, 336, 485
    LIFO stack, 132-134, 138
    Linear programming (LP), 333, 342-343, 365
       maxflow, 439-440
       mincost flow, 425, 479
       multicommodity flow, 483
       network flow algorithms, 371-372
    Linear quantity, 59
    Link, 4, 8
       back, 99
       DFS tree, 99-100
       down, 99-100, 161-162, 202-204
       parent, 99-100, 165
    Locality property, 48
    Longest paths, 75, 199, 315-320
       augmenting paths, 396
       difference constraints, 334-335
       and shortest path, 329-330

    Mail carrier problem, 74, 224, 477-478
    Map, 4, 154, 326
    Matching, 5, 73
       bipartite, 74, 433-436, 476
       maximum, 482
       maximum-cardinality, 433, 482
       minimum-distance point matching, 369
    Mathematical programming, 343
    Maxflow problem, 372, 375-378, 382-440
       acyclic networks, 427-429
       augmenting-path method, 382-407
       bipartite matching, 433-436
       capacity constraints, 426
       connectivity, 437-438
       feasible flow, 430-432
       general networks, 425-426
       linear programming, 439-440
       and mincost flow problem, 425, 472-473
       mincost maxflow, 443-447
       preflow-push method, 410-423
       reductions, 370, 406, 425-440
       running time, 434-436
       spanning tree, 454-455
       standard, 425-426
       undirected networks, 429-430
    Maxflow-mincut theorem, 385-387, 437
    Maximal connected subgraph, 11-12
    Maximum-capacity augmenting path, 394, 399-401, 405-406
    Maximum-cardinality matching, 433, 482
    Maze, 82-86
    Menger's theorem, 119, 437
    Merchandise distribution, 368, 430, 444-445, 475
    Mincost flow problem, 372, 443-479
       assignment problem, 476-477
       cycle-canceling algorithm, 372, 447-452
       edge costs, 474
       eligible edges, 455-457
       feasible flow, 444-445, 472-473
       flow cost, 443
       LP formulation, 425, 479
       mail carrier, 477-478
       and maxflow problem, 425, 472-473
       mincost maxflow, 443-447
       reductions, 472-479
       running time, 451
       single-source shortest paths, 472-473
       transportation, 475-476
       see also Network simplex algorithm
    Mincut, 386-387
    Minimum spanning tree (MST), 72, 227-276
       Boruvka's algorithm, 244, 263-267
       cut and cycle properties, 240-244
       defined, 228
       equal weights, 228-229
       Euclidean, 274-276
       Kruskal's algorithm, 243-244, 258-263, 268
       performance, 268-273, 269
       Prim's algorithm, 243, 247-256, 263, 269
       representations, 237-239
       weighted-graph ADTs, 230-239
    Minimum-distance point matching, 369
    Modular arithmetic, 183-184
    Multicommodity flow, 482-483
    Multigraph, 8
    Multisource paths, 314-318

    Negative cost, 446-447
    Negative cycle, 279-280, 348-350, 446-454
    Negative weight, 345-365
       arbitrage, 348-349
       Bellman-Ford algorithm, 350-356, 358
       Dijkstra's algorithm, 349, 354-360
       Floyd's algorithm, 349-351, 354
    Neighbor graph, 49, 144
    Network, 5, 15, 277-284
       acyclic, 313-321, 334-335, 427-429
       adjacency representations, 37
       communications, 368-369
       distribution, 444-445
       reliability, 370
       residual, 388-391, 412, 417, 446, 453
       reweighting, 324, 357-360
       st-network, 375-378, 429-430
       telephone, 370
       undirected, 429-430
       weighted diameter, 304
       see also Flow network; Shortest path
    Network simplex algorithm, 372, 453-470
       assignment problem, 476-477
       eligible edges, 455-457, 462-468
       feasible spanning tree, 453-455
       implementations, 466-469
       initialization, 464
       parent-link representation, 458-464
       performance, 466-470
       shortest paths, 472-473
       simplex method, 479
       vertex potentials, 454-456, 468
       see also Mincost flow problem
    Node, 8
    Nonlinear cost, 483
    NP-hard problem, 75, 77, 339-340

    Online algorithm, 22
    Operations research (OR), 343, 365
    Optimization, 76
    Ordered pair, 14, 182-183
    Outdegree, 14, 153-154
    Outflow, 375-378

    Parallel edges, 8, 18, 27
       adjacency-lists representation, 34
       networks, 278
       random graphs, 47
       weighted graphs, 237
    Parent-link representation
       BFS tree, 127
       cycle detection, 165
       DFS tree, 99-100
       network simplex algorithm, 458-464
    Partial order, 184-185
    Passage, 82
    Path, 10-11, 56-58
       cyclic, 10, 156, 477-478
       directed, 72, 152, 155, 224
       disjoint, 11, 117
       Euler, 62-64, 109
       Hamilton, 59-62, 224, 339-340
       mail carrier, 477-478
       relaxation, 286, 288-290, 292
       simple, 57-59, 61, 106, 279
       weight, 277
       see also Longest path; Shortest path
    Paths matrix, 289-290, 306, 360
    Performance, 6, 77-79
       abstraction, 42-43
       adjacency-lists representation, 33-35, 37-40, 145-146
       adjacency-matrix representation, 29-30, 37-40, 144-146
       augmenting-path method, 393, 395-406, 434-436
       cycle canceling, 452
       dense/sparse graphs, 13
       DFS forests, 103
       Dijkstra's algorithm, 297-300, 324-326
       equivalent problems, 330-331
       Kruskal's algorithm, 260-262
       MST algorithms, 268-273
       network simplex algorithm, 466-470
       path search, 61-62, 64-65
       PFS, 255-256, 297-300
       preflow-push, 419-423
       preprocessing time, 106-108, 127, 216-217, 221-222
       random graphs, 54
       shortest-paths algorithms, 363-365
       static graphs, 42
       transitive closure, 179-180, 221-222
       union-find algorithm, 145
       vector-of-edges, 37-38
       worst-case, 43-44
       see also Running time
    PERT chart, 150, 345
    Planar graph, 9, 73
    Planarity problem, 73
    Pointer, edge, 232, 235-237, 277-278, 432
    Polynomial-time reduction, 439
    Postorder numbering, 101, 162, 193
    Potential function, 416-419, 454-456, 468
    Precedence constraint, 186, 332
    Preflow, 410-411
    Preflow-push method, 410-423
       edge-based, 413-414
       highest-vertex, 420
       performance, 419-423
       vertex-based, 416
    Preorder numbering, 98-99, 101, 162
       DFS, 106-108
       shortest paths, 127, 304-305
       transitive closure, 216-217, 221-222
    Prim's algorithm, 243, 247-256, 263
       and Dijkstra's algorithm, 294-296
       running time, 269
    Priority queue, 136, 268-269
       augmenting-path method, 392-393
       Dijkstra's algorithm, 296-302
       Kruskal's algorithm, 261-263
       multiway heap implementation, 272
    Priority-first search (PFS), 323
       augmenting-path method, 392-393
       Prim's algorithm, 251-256
    Program structure, 5
    Pushdown stack, 123

    Quicksort, 260, 262, 268

    Radar tracking system, 369
    Radix sort, 260, 268
    Random flow network, 402-404
    Random graph, 47-48, 141-144
    Randomized queue, 137, 402
    Reachability, 152, 158, 166-167
       DAGs, 201-204
       digraphs, 205
       dynamic, 223
       see also Transitive closure
    Reduced cost, 454-457
    Reduction, 177, 283, 484
       difference constraints, 333-336, 338
       equivalent problems, 328
       flow networks, 367
       implications, 341
       job scheduling, 332-338
       linear programming, 333, 342-343
       maxflow, 370, 406, 425-440
       mincost flow, 472-479
       polynomial-time, 439
       shortest paths, 328-343
       transitive, 223
       upper/lower bounds, 342
    Reflexive relation, 183
    Relation, 182-183
    Relaxation, 285-292, 323
    Remove edge operation, 34, 40-41
    Remove the minimum operation, 251, 268-271
    Renyi, A., 144
    Residual network, 388-391, 453
       mincost flow, 446
       preflow-push, 412, 417
    Reverse topological sorting, 193-195
    Reweighting, 324, 357-360
    Road map, 282-283
    Running time, 141
       augmenting-path method, 393, 405
       Bellman-Ford algorithm, 354-356
       Boruvka's algorithm, 265
       DFS, 95-96
       digraphs, 221-222
       Dijkstra's algorithm, 296, 299, 311
       Floyd's algorithm, 309-311
       Kruskal's algorithm, 260-262
       maxflow, 434-436
       mincost flow, 451
       MST algorithms, 269-270
       NP-hard problems, 339
       path search, 61
       preflow-push, 416-419
       Prim's algorithm, 269
       random graph connectivity, 144
       shortest path algorithms, 301
       strong components in digraphs, 205-206
       transitive closure, 172-174, 177, 180, 221-222
       weighted graphs, 235
       see also Performance

    Scheduling problem, 4, 150, 483
       DAGs, 186-187
       precedence-constrained, 332-338
       see also Topological sorting
    Search. See Graph search
    Selection, 331
    Self-loop, 8, 18, 28
       digraphs, 152
       networks, 278
       relations, 183
    Sentinel weight, 235, 278, 287
    Separability, 112-117
    Separation vertex, 117-118
    Set-inclusion DAG, 184
    Shortest path, 176, 277-365
       acyclic networks, 313-321
       augmenting paths, 393-394, 398-399, 405-407
       Bellman-Ford algorithm, 350-356, 358-360
       BFS, 121-123
       defined, 279
       Dijkstra's algorithm, 293-302, 305-307, 349, 354-360
       Euclidean networks, 322-326
       Floyd's algorithm, 304, 307-311, 349-351, 354-356
       and longest path, 329-330
       multisource, 314-318
       negative weights, 345-361
       network simplex algorithm, 472-473
       NP-hard problems, 339-340
       performance, 301, 363-365
       reduction, 328-343
       relaxation, 285-292
       shortest paths tree (SPT), 279, 287-288, 294
       source-sink, 281, 294, 322-326
       terminology, 286, 313
       see also All-pairs shortest path; Network; Single-source shortest path
    Simple connectivity, 72, 106-109
    Simple graph, 8
    Simple path, 10, 57-59, 61
       DFS, 106
       networks, 279
    Simplex method, 479
    Single-source longest paths, 334-335
    Single-source shortest paths, 72, 127, 281
       acyclic networks, 314-315
       Dijkstra's algorithm, 293-294
       and mincost flow problem, 472-473
       negative weights, 350-354
       reachability, 166-167
    Sink, 154, 195-197, 281, 375-378
    Software library, 485
    Sollin, G., 267
    Sorting, 331
    Source vertex, 14, 154, 195-197, 281, 375-378
    Source-sink shortest path, 281, 294, 322-326
    Spanning forest, 12, 93, 110
    Spanning tree, 12, 72
       feasible, 453-455
       maxflow, 454-455
       network simplex algorithm, 457-464
       see also Minimum spanning tree
    Sparse graph, 13, 29
    st-connectivity, 119
    st-cut, 385-387, 427-428
    st-network, 375-378, 429-430
    Stack, LIFO, 132-134, 138
    Stack-based augmenting-path method, 400, 402
    Static graph, 18-19, 42, 50
    STL list, 31-33
    Strong components, 157-158, 205-214
       transitive closure, 217-219
    Strong connectivity, 72, 156-158, 205
    Subgraph, 9
       forbidden, 73
       maximal connected, 11-12
    Subset inclusion, 184
    Supply lines problem, 370, 386-387
    Symbol table
       find edge, 41
       graph-building function, 50-52
       indexing function, 51
    Symmetric relation, 183

    Tarjan, R. E., 410
    Tarjan's algorithm, 73, 206, 210-213
    Telephone network, 370
    Topological sorting, 150, 187, 191-199
       DFS, 193-195, 201-204
       multisource shortest-paths, 314-318
       relabeling/rearrangement, 191-192
       reverse, 193-195
    Total order, 185
    Tour, 10
       Euler, 62-64, 109
       Hamilton, 59-62
       mail carrier problem, 74
       traveling salesperson problem, 76
    Tractable problem, 72
    Traffic flow, 369
    Transaction, 5
    Transaction graph, 49-50
    Transitive closure, 72, 169-180
       abstract, 174-175, 216-220
       and all-pairs shortest paths, 175, 328-329
       Boolean matrix multiplication, 169-172, 176-177
       DAGs, 201-204
       DFS-based, 177-179
       performance, 172-174, 177, 179-180, 221-222
       of a relation, 183
       Warshall's algorithm, 172-175
    Transitive reduction, 223
    Transitive relation, 183
    Transportation problem, 368, 475-476
    Traveling salesperson problem, 76
    Tree, 12, 72
       BFS, 124-129
       binary, 188-190
       and DAGs, 188-190
       DFS, 90, 98-103, 113-117, 161-162
       edge, 99, 113-115, 161-162, 202
       preorder tree traversal, 101
       shortest-path tree (SPT), 279, 287-288, 294
       spanning, 453-455, 457-464
       see also Minimum spanning tree (MST)
    Tree link, 99-100
    Tremaux exploration, 83-86, 87-90, 109
    Two-coloring, 110-111
    Two-way Euler tour, 66, 109

    Uncapacitated edge, 381
    Undirected graph, 14-15, 36
       and digraphs, 153, 155-162, 165-167, 179-180
       networks, 429-430
       reachability, 205
       underlying, 15
    Uniconnected digraph, 224
    Union, 12
    Union-find algorithm, 22, 43
       Boruvka's algorithm, 264-265
       and DFS, 108-109
       Kruskal's algorithm, 263
       performance, 145

    Vector, vertex-indexed, 37, 96
    Vector-of-edges representation, 24, 37
    Vertex, 7-10
       active, 411
       adjacent, 9
       connectivity, 119, 438
       cut, 117-118
       degree of, 9
       destination, 14
       disjoint, 11
       dummy, 376-377
       excess, 411
       fringe, 253
       height, 412-415
       indegree/outdegree, 14
       inflow/outflow, 375-378
       marking, 92-93
       ordered pair, 14
       potentials, 416-419, 454-456, 468
       printing, 19-20
       reachable, 152, 158
       removing, 41
       search, 109-110
       separation, 117-118
       sink/source, 14, 154, 195-197, 281, 375-378
    Vertex-based preflow-push algorithm, 416
    Vertex-indexed vector, 37, 96
    V -vertex graph, 7

    Warshall's algorithm, 172-175, 289-290, 307-309
    Weighted diameter, 304
    Weighted graph, 15, 227-229
       adjacency-matrix representation, 37
       ADTs, 230-239
       arbitrary weights, 228
       bipartite matching, 74
       digraphs, 277-278
       edge weights, 234-235
       equal weights, 228-229
       integer weights, 379-380
       negative weights, 345-365
       path weight, 277
       reweighting, 324, 357-360
       sentinel weight, 235, 278
       see also Minimum spanning tree (MST); Shortest path
    Whitney's theorem, 119
    World Wide Web, 4



    Click for the Errata related to this title.

    Submit Errata

    More Information

    InformIT Promotional Mailings & Special Offers

    I would like to receive exclusive offers and hear about products from InformIT and its family of brands. I can unsubscribe at any time.


    Pearson Education, Inc., 221 River Street, Hoboken, New Jersey 07030, (Pearson) presents this site to provide information about products and services that can be purchased through this site.

    This privacy notice provides an overview of our commitment to privacy and describes how we collect, protect, use and share personal information collected through this site. Please note that other Pearson websites and online products and services have their own separate privacy policies.

    Collection and Use of Information

    To conduct business and deliver products and services, Pearson collects and uses personal information in several ways in connection with this site, including:

    Questions and Inquiries

    For inquiries and questions, we collect the inquiry or question, together with name, contact details (email address, phone number and mailing address) and any other additional information voluntarily submitted to us through a Contact Us form or an email. We use this information to address the inquiry and respond to the question.

    Online Store

    For orders and purchases placed through our online store on this site, we collect order details, name, institution name and address (if applicable), email address, phone number, shipping and billing addresses, credit/debit card information, shipping options and any instructions. We use this information to complete transactions, fulfill orders, communicate with individuals placing orders or visiting the online store, and for related purposes.


    Pearson may offer opportunities to provide feedback or participate in surveys, including surveys evaluating Pearson products, services or sites. Participation is voluntary. Pearson collects information requested in the survey questions and uses the information to evaluate, support, maintain and improve products, services or sites, develop new products and services, conduct educational research and for other purposes specified in the survey.

    Contests and Drawings

    Occasionally, we may sponsor a contest or drawing. Participation is optional. Pearson collects name, contact information and other information specified on the entry form for the contest or drawing to conduct the contest or drawing. Pearson may collect additional personal information from the winners of a contest or drawing in order to award the prize and for tax reporting purposes, as required by law.


    If you have elected to receive email newsletters or promotional mailings and special offers but want to unsubscribe, simply email information@informit.com.

    Service Announcements

    On rare occasions it is necessary to send out a strictly service related announcement. For instance, if our service is temporarily suspended for maintenance we might send users an email. Generally, users may not opt-out of these communications, though they can deactivate their account information. However, these communications are not promotional in nature.

    Customer Service

    We communicate with users on a regular basis to provide requested services and in regard to issues relating to their account we reply via email or phone in accordance with the users' wishes when a user submits their information through our Contact Us form.

    Other Collection and Use of Information

    Application and System Logs

    Pearson automatically collects log data to help ensure the delivery, availability and security of this site. Log data may include technical information about how a user or visitor connected to this site, such as browser type, type of computer/device, operating system, internet service provider and IP address. We use this information for support purposes and to monitor the health of the site, identify problems, improve service, detect unauthorized access and fraudulent activity, prevent and respond to security incidents and appropriately scale computing resources.

    Web Analytics

    Pearson may use third party web trend analytical services, including Google Analytics, to collect visitor information, such as IP addresses, browser types, referring pages, pages visited and time spent on a particular site. While these analytical services collect and report information on an anonymous basis, they may use cookies to gather web trend information. The information gathered may enable Pearson (but not the third party web trend services) to link information with application and system log data. Pearson uses this information for system administration and to identify problems, improve service, detect unauthorized access and fraudulent activity, prevent and respond to security incidents, appropriately scale computing resources and otherwise support and deliver this site and its services.

    Cookies and Related Technologies

    This site uses cookies and similar technologies to personalize content, measure traffic patterns, control security, track use and access of information on this site, and provide interest-based messages and advertising. Users can manage and block the use of cookies through their browser. Disabling or blocking certain cookies may limit the functionality of this site.

    Do Not Track

    This site currently does not respond to Do Not Track signals.


    Pearson uses appropriate physical, administrative and technical security measures to protect personal information from unauthorized access, use and disclosure.


    This site is not directed to children under the age of 13.


    Pearson may send or direct marketing communications to users, provided that

    • Pearson will not use personal information collected or processed as a K-12 school service provider for the purpose of directed or targeted advertising.
    • Such marketing is consistent with applicable law and Pearson's legal obligations.
    • Pearson will not knowingly direct or send marketing communications to an individual who has expressed a preference not to receive marketing.
    • Where required by applicable law, express or implied consent to marketing exists and has not been withdrawn.

    Pearson may provide personal information to a third party service provider on a restricted basis to provide marketing solely on behalf of Pearson or an affiliate or customer for whom Pearson is a service provider. Marketing preferences may be changed at any time.

    Correcting/Updating Personal Information

    If a user's personally identifiable information changes (such as your postal address or email address), we provide a way to correct or update that user's personal data provided to us. This can be done on the Account page. If a user no longer desires our service and desires to delete his or her account, please contact us at customer-service@informit.com and we will process the deletion of a user's account.


    Users can always make an informed choice as to whether they should proceed with certain services offered by InformIT. If you choose to remove yourself from our mailing list(s) simply visit the following page and uncheck any communication you no longer want to receive: www.informit.com/u.aspx.

    Sale of Personal Information

    Pearson does not rent or sell personal information in exchange for any payment of money.

    While Pearson does not sell personal information, as defined in Nevada law, Nevada residents may email a request for no sale of their personal information to NevadaDesignatedRequest@pearson.com.

    Supplemental Privacy Statement for California Residents

    California residents should read our Supplemental privacy statement for California residents in conjunction with this Privacy Notice. The Supplemental privacy statement for California residents explains Pearson's commitment to comply with California law and applies to personal information of California residents collected in connection with this site and the Services.

    Sharing and Disclosure

    Pearson may disclose personal information, as follows:

    • As required by law.
    • With the consent of the individual (or their parent, if the individual is a minor)
    • In response to a subpoena, court order or legal process, to the extent permitted or required by law
    • To protect the security and safety of individuals, data, assets and systems, consistent with applicable law
    • In connection the sale, joint venture or other transfer of some or all of its company or assets, subject to the provisions of this Privacy Notice
    • To investigate or address actual or suspected fraud or other illegal activities
    • To exercise its legal rights, including enforcement of the Terms of Use for this site or another contract
    • To affiliated Pearson companies and other companies and organizations who perform work for Pearson and are obligated to protect the privacy of personal information consistent with this Privacy Notice
    • To a school, organization, company or government agency, where Pearson collects or processes the personal information in a school setting or on behalf of such organization, company or government agency.


    This web site contains links to other sites. Please be aware that we are not responsible for the privacy practices of such other sites. We encourage our users to be aware when they leave our site and to read the privacy statements of each and every web site that collects Personal Information. This privacy statement applies solely to information collected by this web site.

    Requests and Contact

    Please contact us about this Privacy Notice or if you have any requests or questions relating to the privacy of your personal information.

    Changes to this Privacy Notice

    We may revise this Privacy Notice through an updated posting. We will identify the effective date of the revision in the posting. Often, updates are made to provide greater clarity or to comply with changes in regulatory requirements. If the updates involve material changes to the collection, protection, use or disclosure of Personal Information, Pearson will provide notice of the change through a conspicuous notice on this site or other appropriate way. Continued use of the site after the effective date of a posted revision evidences acceptance. Please contact us if you have questions or concerns about the Privacy Notice or any objection to any revisions.

    Last Update: November 17, 2020