graph - University of California, Davislrademac/Sp16_2331/graph.pdfDefinition. A graph is connected...
Transcript of graph - University of California, Davislrademac/Sp16_2331/graph.pdfDefinition. A graph is connected...
CSE 2331
Graph
Graph G
G.V = Set of vertices of graph G.
G.E = Set of edges of graph G.
(vi, vj) = edge with endpoints vi and vj .
Vertices vi ∈ G.V and vj ∈ G.V are incident on edge (ei, ej) ∈ G.E.
8.2
CSE 2331
Vertex Degree
deg(vi) = degree of vi = # edges incident on vi.
What is the degree of each vertex?
v1
}}}}
}}}}
}
BBBB
BBBB
B
v2
}}}}
}}}}
}
BBBB
BBBB
Bv3
}}}}
}}}}
}
v4 v5
8.3
CSE 2331
Sum of deg(vi)
m = number of graph edges.
Proposition:∑
vi∈V deg(vi) = 2m.
Proof 1:
∑vi∈V deg(vi) = sum of # edges incident on vertices
= sum of # vertices incident on edges
= 2× (# edges) = 2m.
Proof 2: Let δij = 1 if ej is incident on vi and 0 otherwise.∑
vi∈V
deg(vi) =∑
vi∈V
∑
ej∈E
δij =∑
ej∈E
∑
vi∈V
δij =∑
ej∈E
2 = 2m.
8.4
CSE 2331
Graph Representation
v1
oooooooOOOOOOO
v2
oooooooOOOOOOO v3
ooooooo
v4 v5
Adjacency matrix: Adjacency lists:
v1 v2 v3 v4 v5
v1 :
v2 :
v3 :
v4 :
v5 :
2
6
6
6
6
4
0 1 1 0 0
1 0 1 1 1
1 1 0 0 1
0 1 0 0 0
0 1 1 0 0
3
7
7
7
7
5
v1 : (v2, v3)
v2 : (v1, v3, v4, v5)
v3 : (v1, v2, v5)
v4 : (v2)
v5 : (v2, v3)
A[i, j] = 1 if (vi, vj) is an edge. V [i].degree = size of adj list.
V [i].AdjList[k] =
k’th element of the adjacency list.
8.5
CSE 2331
Sample Graph Algorithm
Input : Graph G represented by adjacency lists.
Func(G)
1 k ← 0;
2 foreach vertex vi in G.V do /* G.V = vertices of G */3 foreach edge (vi, vj) incident on vi do
4 k ← k + 1;
5 end
6 end
7 return (k);
8.6
CSE 2331
Connected Graphs
Definition. A path in a graph is a sequence of vertices
(w1, w2, . . . , wk) such that there is an edge (wi, wi+1) between
every two adjacent vertices in the sequence.
Definition. A graph is connected if for every two vertices
v, w ∈ G.V , the graph has some path from v to w.
Is the following graph connected?
v1
uuuuuu
uu
IIIIII
IIv2
uuuuuu
uuv6
����
����
����
v3
IIIIII
IIv4 v5
v7 v8 v9
8.7
CSE 2331
Connected Graphs
Is the following graph connected?
v12 v1
v11 v2
��������������������
�����������������������
v10
zzzzzzzzzzzz v3
ppppppppppppppppppppppppp
fffffffffffffffffffffffff
WWWWWWWWWWWWWWWWWWWWWW
v9 v4
v8 v5
NNNNNNNNNNNNNNNNNNNNNNNNN
v7 v6
8.8
CSE 2331
Connected Graphs
Is the following graph connected?
v12 v1
v11 v2
��������������������
�����������������������
v10
zzzzzzzzzzzz v3
ppppppppppppppppppppppppp
fffffffffffffffffffffffff
WWWWWWWWWWWWWWWWWWWWWW
v9 v4
v8 v5
v7 v6
8.9
CSE 2331
Query Connected: Depth First Search
procedure QueryConnected(G)
1 foreach vertex vi in G.V do /* G.V = vertices of G */
2 vi.mark← NotVisited;
3 end
4 DFS(G,1);
5 foreach vertex vi in G.V do
6 if (vi.mark = NotVisited) then return false;
7 end
8 return true;
8.10
CSE 2331
Depth First Search
procedure DFS(G, i)
/* Depth first search from vertex vi */
1 G.V[i].mark← Visited;
2 foreach edge (i, j) incident on vertex i do
3 if (G.V[j].mark = NotVisited()) then
4 DFS (G,j);
5 end
6 end
8.11
CSE 2331
Depth First Search Tree
procedure DFStree(G, i)
/* Depth first search from vertex vi */
1 G.V[i].mark← Visited;
2 foreach edge (i, j) incident on vertex i do
3 if (G.V[j].mark = NotVisited()) then
4 G.V[j].parent← i;
5 DFStree (G,j);
6 end
7 end
8.12
CSE 2331
Example
v8 v1
????
????
���������������������
oooooooooooooo
v7 v2
��������������
v6
��������������
v3
??????????????????
v5
//////////////
v4
8.13
CSE 2331
Directed Graph Representation
v1
''OOOOOOO
wwooooooo
v2
wwooooooo''OOOOOOO v3
oo}}
v4 v5
==
Adjacency matrix: Adjacency lists:
v1 v2 v3 v4 v5
v1 :
v2 :
v3 :
v4 :
v5 :
2
6
6
6
6
4
0 1 1 0 0
0 0 0 1 1
0 1 0 0 1
0 0 0 0 0
0 0 1 0 0
3
7
7
7
7
5
v1 out : (v2, v3)
v2 out : (v4, v5)
v3 out : (v2, v5)
v4 out : ()
v5 out : (v3)
v1 in : ()
v2 in : (v1, v3)
v3 in : (v1, v5)
v4 in : (v2)
v5 in : (v2, v3)
A[i, j] = 1 if (vi, vj) is an edge.
8.15
CSE 2331
Sum of outdeg(vi) and sum of indeg(vi)
m = number of graph edges.
Proposition:∑
vi∈G.V outdeg(vi) = m.
Proposition:∑
vi∈G.V indeg(vi) = m.
8.16
CSE 2331
Sample Graph Algorithm
Input : Directed graph G represented by adjacency lists.
Func(G)
1 k ← 0;
2 foreach vertex vi in G.V do /* G.V = vertices of G */3 foreach directed edge (vi, vj) incident on vi do
4 k ← k + 1;
5 end
6 end
7 return (k);
8.17
CSE 2331
Directed Graph
How many vertices are reachable by a directed path from v1?
v12
��)))
))))
))))
))))
))))
))))
��������������������
v1
��111
1111
1111
1111
wwoooooooooooooooooov11
++WWWWWWWWWWWWWWWWWWWWWWv2
wwppppppppppppppppppppppppp
v10
��
v3
~~}}}}
}}}}
}}}}
}}}}
}}}}
ffMMMMMMMMMMMMMMMM
v9
++WWWWWWWWWWWWWWWWWWWWWWv4
ssgggggggggggggggggggggg
v8
>>|||||||||||||||||||||||||
v5
OO
v7
JJ�����������������������
UU********************
OO
v6
88pppp
8.18
CSE 2331
Directed Graph
How many vertices are reachable by a directed path from v12?
v12
��)))
))))
))))
))))
))))
))))
��������������������
v1
��111
1111
1111
1111
wwoooooooooooooooooov11
++WWWWWWWWWWWWWWWWWWWWWWv2
wwppppppppppppppppppppppppp
v10
��
v3
~~}}}}
}}}}
}}}}
}}}}
}}}}
ffMMMMMMMMMMMMMMMM
v9
++WWWWWWWWWWWWWWWWWWWWWWv4
ssgggggggggggggggggggggg
v8
>>|||||||||||||||||||||||||
v5
OO
v7
JJ�����������������������
UU********************
OO
v6
88pppp
8.19
CSE 2331
Num Reachable: Depth First Search
procedure NumReachable(G, k)
1 foreach vertex vi in G.V do /* G.V = vertices of G */2 vi.mark← NotVisited;
3 end
4 DirectedDFS(G,k);
5 count← 0;
6 foreach vertex vi in G.V do
7 if (vi.mark = Visited) then count← count + 1;
8 end
9 return count;
8.20
CSE 2331
Directed Depth First Search
procedure DirectedDFS(G, i)
/* Depth first search from vertex vi */
1 G.V[i].mark← Visited;
2 foreach directed edge (i, j) incident on vertex i do
3 if (G.V[j].mark = NotVisited()) then
4 DFS (G,j);
5 end
6 end
8.21
CSE 2331
Is Reachable?
Is vertex v12 reachable by a directed path from vertex v1?
v12
��222
2222
2222
2222
2222
2222
��
v1
��111
1111
1111
1111
��
v11
++WWWWWWWWWWWWWWWWWWWWWWv2
wwppppppppppppppppppppppppp
v10
77oooooooooooooooooo
��
v3
��
ffMMMMMMMMMMMMMMMM
v9
++WWWWWWWWWWWWWWWWWWWWWWv4
ssgggggggggggggggggggggg
v8
>>|||||||||||||||||||||||||
v5
OO
v7
88qqqqqqqqqqqqqqqq
UU********************
v6
bbDDDDDDDDDDDDDDDDDDDDDD
8.22
CSE 2331
Is Reachable?
Is vertex v1 reachable by a directed path from vertex v12?
v12
��222
2222
2222
2222
2222
2222
��
v1
��111
1111
1111
1111
��
v11
++WWWWWWWWWWWWWWWWWWWWWWv2
wwppppppppppppppppppppppppp
v10
77oooooooooooooooooo
��
v3
��
ffMMMMMMMMMMMMMMMM
v9
++WWWWWWWWWWWWWWWWWWWWWWv4
ssgggggggggggggggggggggg
v8
>>|||||||||||||||||||||||||
v5
OO
v7
88qqqqqqqqqqqqqqqq
UU********************
v6
bbDDDDDDDDDDDDDDDDDDDDDD
8.23
CSE 2331
Is Reachable: Depth First Search
procedure IsReachable(G, k, q)
1 foreach vertex vi in G.V do /* G.V = vertices of G */2 vi.mark← NotVisited;
3 end
4 DirectedDFS(G,k);
5 if (vq.mark = Visited) then return true;
6 else return false;
8.24
CSE 2331
Directed Acylic Graph (DAG)
A directed graph with no cycles is called a directed acyclic
graph or DAG.
v1
''NNNNNNNNNN
��
v6 v2
v5
@@�������������
33gggggggggggggggggggg
OO
v3
wwpppppppppp
kkWWWWWWWWWWWWWWWWWWWW
v4
8.26
CSE 2331
Topological Sort
Sort vertices of a directed acyclic graph so that for every edge (vi, vj),
vertex vi precedes vj .v1
''NNNNNNNNN
��
v6 v2
v5
@@������������
33gggggggggggggggggg
OO
v3
wwppppppppp
kkWWWWWWWWWWWWWWWWWW
v4
v5
$$
77 88v3//
''v6 v1
//$$
v4 v2
8.27
CSE 2331
Topological Sort: Example
v12
��������������������uukkkkkk
v1
��111
1111
1111
1111
||zzzz
zzzz
zzzz
zzzz
zzzz
zzv11
�������
v2
��000
00
�������������������������
v10
33gggggggggggggggggggggg
""DDDD
DDDD
DDDD
DDDD
DDDD
DDv3
��
v9
OO
v4
xxqqqqqqqqqqqqqqqq
v8 ))SSSSSSv5xxpppp
kkWWWWWWWWWWWWWWWWWWWWWW
YY22222222222222222222222
v7 v6
8.28
CSE 2331
Topological Sort
procedure TopologicalSort(G)
/* Report vertices of G in topologically sorted order */
1 foreach vertex vi in G.V do/* S is a stack of vertices. */
2 if (indeg(vi) = 0) then S.Push(vi);
3 end
4 while (S is not empty) do5 vi ← S.Pop();
6 Report vi;
7 foreach edge (vi, vj) incident on vi do8 Delete (vi, vj) from G;
9 if (indeg(vj) = 0) then S.Push(vj);
10 end
11 end
8.29
CSE 2331
Topological Sort: Simplified Implementation
procedure TopologicalSort(G)
/* Report vertices of G in topologically sorted order */
1 foreach vertex vi in G.V do/* S is a stack of vertices. */
2 inCount[vi]← indeg(vi);
3 if (inCount[vi] = 0) then S.Push(vi);
4 end
5 while (S is not empty) do6 vi ← S.Pop();
7 Report vi;
8 foreach edge (vi, vj) incident on vi do9 inCount[vj ]← inCount[vj ]− 1;
10 if (inCount[vj ] = 0) then S.Push(vj);
11 end
12 end
8.30