Graphs
Algorithm Design and Analysis
Bibliography:
[CLRS]- Subchap 22.1 – Representation of Graphs
Graphs (part1)
• Basic concepts
• Graph representation
Graphs
• A graph G = (V, E)
– V = set of vertices
– E = set of edges = subset of V V
– |E| <= |V|2
Directed/undirected graphs
• In an undirected graph:
– Edge (u,v) E implies that also edge (v,u) E
– Example: road networks between cities
• In a directed graph:
– Edge (u,v) E does not imply edge (v,u) E
– Example: street networks in downtown
Directed/undirected graphs
Directed graph Undirected graph
[CLRS] Fig 22.1, 22.2
• Self-loop edges are possible only in directed graphs
Degree of a vertex
In-degree=2 degree=3
Out-degre=1
• Degree of a vertex v:
– The number of edges adjacenct to v
– For directed graphs: in-degree and out-degree
Weighted/unweighted graphs
• In a weighted graph, each edge has an
associated weight (numerical value)
Connected/disconnected graphs
• An undirected graph is a connected graph if
there is a path between any two vertices
• A directed graph is strongly connected if there is
a directed path between any two vertices
Dense/sparse graphs
• Graphs are dense when the number of edges is
close to the maximum possible, |V|2
• Graphs are sparse when the number of edges is
small (no clear threshold)
• If you know you are dealing with dense or
sparse graphs, different data structures are
recommended for representing graphs
– Adjacency matrix
– Adjacency list
Representing Graphs –
Adjacency Matrix
• Assume vertexes are numbered V = {1, 2, …, n}
• An adjacency matrix represents the graph as a n
x n matrix A:
– A[i, j] = 1 if edge (i, j) E
= 0 if edge (i, j) E
• For weighted graph
– A[i, j] = wij if edge (i, j) E
= 0 if edge (i, j) E
• For undirected graph
– Matrix is symmetric: A[i, j] = A[j, i]
Graphs: Adjacency Matrix
• Example – Undirected graph:
[CLRS] Fig 22.1
Graphs: Adjacency Matrix
• Example – Directed Unweighted Graph:
[CLRS] Fig 22.2
Graphs: Adjacency Matrix
• Time to answer if there is an edge between
vertex u and v: Θ(1)
• Memory required: Θ(n2) regardless of |E|
– Usually too much storage for large graphs
– But can be very efficient for small graphs
Graphs: Adjacency List
• Adjacency list: for each vertex v V, store a list
of vertices adjacent to v
• Weighted graph: for each vertex u adj[v], store
also weight(v,u)
Graph representations: Adjacency List
• Undirected unweighted graph
[CLRS] Fig 22.1
Graph representations: Adjacency List
• Directed unweighted graph
[CLRS] Fig 22.2
Graphs: Adjacency List
• How much memory is required?
• For directed graphs
– |adj[v]| = out-degree(v)
– Total number of items in adjacency lists is
out-degree(v) = |E|
• For undirected graphs
– |adj[v]| = degree(v)
– Number of items in adjacency lists is
degree(v) = 2 |E|
• Adjacency lists needs (V+E) memory space
• Time needed to test if edge (u, v) E is O(E)
Graph Implementation - Lab
• http://staff.cs.upt.ro/~ioana/algo/2019/
lab_mst.html
• You are given an implementation of a SimpleGraph ADT:
– ISimpleGraph.java defines the interface of the SimpleGraph ADT
– DirectedGraph.java is an implementation of the SimpleGraph as
a directed graph. The implementation uses adjacency
structures.
– UndirectedGraph.java is an implementation of SimpleGraph as a
undirected graph. The implementation extends class
DirectedGraph described before, by overriding two methods:
addEdge and allEdges.