Graphs: Graph G (V, E)
Graphs: Graph G (V, E)
F
C
D
E.G.M. Petrakis
E
Graphs
Terminology
Two vertices are adjacent if they are
connected with an edge
Adjacent or neighbor vertices
Subgraph of G=(V,E): a graph G=(V,E)
where V, E are subsets of V, E
|V|,|E|: number of nodes, edges of G
Complete graph: contains all possible edges
|E| in (|V|2)
E.G.M. Petrakis
Graphs
Undirected Graphs
B
C
G
H
Graphs
Directed Graphs
B
C
G
H
Graphs
A
B
D
A
C
C
D
F
G
E.G.M. Petrakis
Graphs
More Definitions
Vertex degree: maximum number of
incoming or outgoing edges
in-degree: number of incoming edges
out-degree: number outgoing edges
Graphs
relation
3
weighted
10
10
7
17
E.G.M. Petrakis
17
Graphs
Paths
There exist edges connecting two nodes
Length of path: number of edges
Weighted graphs: sum of weights on path
Cycle: path (of length 3 or more)
connecting a vertex with itself
Cyclic graph: contains cycle
Acyclic graph: does not contain cycle
DAG: Directed Acyclic Graph
E.G.M. Petrakis
Graphs
Connected Graphs
0
4
1
Graphs
Operations on Graphs
join (a,b)
a
join (a,b,x)
a
remv[wt] (a,b,x)
adjacent (a,b) a
a
x
a
b
b
b
c
E.G.M. Petrakis
Graphs
10
Build a Graph
read(n);
read and create n nodes
label them from 1 .. n
// number of nodes
Graphs
11
0
1
2
3
4
4
1
E.G.M. Petrakis
2 3 4
1
1
adjacency matrix
adjacency list
Graphs
12
0
1
2
3
4
4
1
E.G.M. Petrakis
1
1
1
1
1
3 4
1
1 1
1 1
adjacency matrix
4
2
Graphs
adjacency list
13
Matrix Implementation
Simple but difficult to process edges,
unused space in matrix
mark: 1D array marking vertices
mark[i] = 1 if vertex i has been visited
typedef int *Edge;
matrix: the actual Graph implemented as an
1D array of size n2
edge (i, j) is found at matrix[i*n + j]
if edge exists matrix[i*n + j] = wt
otherwise matrix[i*n + j] = NOEDGE
E.G.M. Petrakis
Graphs
14
Graph Interface
interface Graph {
public int n();
public int e();
public Edge first(int v);
public Edge next(Edge w);
public boolean isEdge(Edge w);
public boolean isEdge(int i, int j);
public int v1(Edge w);
public int v2(Edge w);
public void setEdge(int i, int j, int weight);
public void setEdge(Edge w, int weight);
public void delEdge(Edge w);
public void delEdge(int i, int j);
public int weight(int i, int j);
public int weight(Edge w);
public void setMark(int v, int val);
public int getMark(int v);
} // interface Graph
E.G.M. Petrakis
Graphs
Graphs
16
// Constructor
Graphs
// Number of vertices
// Number of edges
17
Graphs
18
E.G.M. Petrakis
Graphs
19
E.G.M. Petrakis
Graphs
20
// Delete edge w
E.G.M. Petrakis
Graphs
21
// Set Mark
// Get Mark
} // class Graphm
E.G.M. Petrakis
Graphs
22
Graphs
23
Graphs
24
// Number of edges
E.G.M. Petrakis
Graphs
25
Graphs
26
E.G.M. Petrakis
Graphs
27
Graphs
28
Graphs
29
A Better Implementation
arcptr
info nextnode
ndptr
info: data
arcptr: pointer to an adjacent
node
nextnode: pointer to a graph
B
node
D
C
E.G.M. Petrakis
nextarc
Graphs
30
graph
A
n
i
l
n
i
l
n
i
l
n
i
l
<D,B>
n
i
l
<C,E>
n
i
l
<A,B>
E.G.M. Petrakis
<A,C>
<A,D>
Graphs
<A,E>
31
Graph Traversal
Trees
preorder
inorder
postorder
Graphs
Depth First Search (DFS)
Breadth First Search (BFS)
E.G.M. Petrakis
Graphs
32
void DFS(v) {
Mark(v) = true;
for each vertex w adjacent to v
if (!Mark(w)) DFS(w)
}
E.G.M. Petrakis
Graphs
33
v = v1
v1
v2
v4
v3
v5 v6
DFS :
V1V2V4V8V5V6V3V7
v7
v8
v1
v2
v3
v4
v5
v6
v7
v8
E.G.M. Petrakis
2
1
1
2
2
3
3
4
3
4
6
8
8
8
8
5
5
7
6
Graphs
7
34
DFS Algorithm
static void DFS (Graph G, int v) {
PreVisit(G, v);
// Take appropriate action
G.setMark(v, VISITED);
for ( Edge w = G.first(v); G.isEdge(w); w = G.next(w))
if (G.getMark(G.v2(w)) = = UNVISITED)
DFS ( G, G.v2(w));
PostVisit(G, v);
// Take appropriate action
}
E.G.M. Petrakis
Graphs
35
Complexity of DFS
O(|V| + |E|): adjacency list
representation
O(|V|2) in dense graphs
E.G.M. Petrakis
Graphs
36
v3
v5
v6
FS :
V1V2V3V4V5V6V7V8
v7
v8
E.G.M. Petrakis
Graphs
37
BFS (cont.)
Starting from vertex v, all nodes unvisited, visit
adjacent nodes (use a queue)
void BFS(v) {
visited(v) = true;
enqueue(v, Q);
while ( Q 0 ) {
x = dequeue(Q);
for each y adjacent x
do if ! Mark(y) {
Mark(y) = TRUE;
enqueue(y,Q);
}
}
}
E.G.M. Petrakis
Graphs
38
v1
v = v1
v2
v3
front
v1
front
rear
v2
v3
v3
rear
v4
v5
v5
rear
v6
v7
output(v3)
rear
v8
output(v4)
front
front
v4
v4 v5 v6 v7
v8
front
v5
v6
v7
front
v6
v7
v8
front
v6
v8
E.G.M. Petrakis
output(v1)
output(v2)
rear
output(v5)
output(v6)
output(v7)
Graphs
39
Complexity of BFS
O(|V|+|E|) : adjacency list
representation
d1 + d2 + ...+ dn = |E|
di = degree (vi)
O(|V|2) : adjacency matrix
representation
E.G.M. Petrakis
Graphs
40
BFS Algorithm
void BFS (Graph G, int start) {
Queue Q(G.n( ));
Q.enqueue(start);
G.setMark(start, VISITED);
while ( !Q.isEmpty( ))
{
int v = Q.dequeue( );
PreVisit(G, v);
// Take appropriate action
for ( Edge w = G.first(v); G.isEdge(w); w = G.next(w))
if (G.getMark(G.v2(w)) = = UNVISITED) {
G.setMark(G.v2(w), VISITED); Q.enqueue(G.v2(w));
}
PostVisit(G, v);
// Take appropriate action
}
}
E.G.M. Petrakis
Graphs
41
Connected - Unconnected
B
A
C
D
B
C
unconnected graph:
not always a path
F
G
D
connected components
E.G.M. Petrakis
Graphs
42
Connected Components
If there exist unconnected nodes in a DFS or BFS
traversal of G then G is unconnected
Find all connected components:
void COMP(G, n)
{
for i = 1 to n
if Mark(i) == UNVISITED
then DFS(i) [or BFS(i)];
}
Graphs
43
Spanning Trees
Tree formed from edges and nodes of G
(G,E)
Spanning Tree
E.G.M. Petrakis
Graphs
44
Spanning Forest
Set of disjoint spanning trees Ti of G=(V,E)
Ti = ( Vi , Ei ) 1 i k, Vi,Ei:subsets of V, E
DFS produces depth first spanning trees
or forest
BFS breadth first spanning trees or forest
Undirected graphs provide more traversals
produce less but short spanning trees
Directed graphs provide less traversals
produce more and higher spanning trees
E.G.M. Petrakis
Graphs
45
DFS
DFS
C
D
A
B
E.G.M. Petrakis
DFS
Graphs
46
BFS
A
FS
A
B
FS
C
BFS spanning
forest
E.G.M. Petrakis H
Graphs
47
1
5 3
6
Complexity O(|V|2)
5 4
4
Prims algorithm:
5
2
1
3
1
3
1
3
1
5 3
1
5 3
4
6
4
4
4
4
2
3
4
4
costT = 1 + 5 + 2 + 4 + 3
E.G.M. Petrakis
Graphs
48
Prims Algorithm
static void Prim(Graph G, int s, int[] D )
{//prims MST algorithm
int[] V = new int[G.n( )];
// whos closest
for (int i=0; i<G.n( ); i++) D[i] = INFINITY; // initialize
D[s] = 0;
for ( i=0; i<G.n( ); i++) {
// process the vertices
int v = minVertex(G, D);
G.setMark(v], VISITED);
if ( v != s ) AddEdgetoMST(V[v], v); // add this edge to MST
if (D[v] == INFINITY ) return;
// unreachable vertices
for ( Edge w = G.first(v); G.isEdge(w); w = G.next(w))
if (D[G.v2(w)] > G.weight(w)) {
D[G.v2(w)] = G.weight(w);
// update distance and
V[G.v2(w)] = v;
// who it came from
}
}
}
E.G.M. Petrakis
Graphs
49
E.G.M. Petrakis
Graphs
50
Dijkstras Algorithm
Find the shortest path from a given node
to every other node in a graph G
no better algorithm for single ending node
Notation:
E.G.M. Petrakis
Graphs
51
10
starting point: v = 1
100
30
50
10
60
20
step
D(2)
D(3)
D(4)
D(5)
{1}
10
infinite
30
100
{1,2}
10
60
30
100
{1,2,4}
10
50
30
90
{1,2,4,3}
10
50
30
60
{1,2,4,3,5}
10
50
30
60
E.G.M. Petrakis
Graphs
52
S = {1};
for i = 2 to n D[i] = C[i,j];
while (S != V) {
choose w from V-S: D[w] = minimum
S = S + {w};
for each v in VS: D[v] = min{D[v], D[w]+[w,v]}*;
}
}
E.G.M. Petrakis
Graphs
53
E.G.M. Petrakis
Graphs
54
E.G.M. Petrakis
Graphs
55