GRAPH ALGORITHM Nattee Niparnan
GRAPH ALGORITHMNattee Niparnan
Graph
A pair G = (V,E) V = set of vertices
(node) E = set of edges
(pairs of vertices)
V = (1,2,3,4,5,6,7) E = ((1,2),(2,3),(3,5),
(1,4),(4,5),(6,7))
1
2
3
45
67
Term you should already know
directed, undirected graph Weighted graph Bipartite graph Tree
Spanning tree Path, simple path Circuit, simple circuit Degree
Representing a Graph
Adjacency Matrix A = |V|x|V| matrix
axy = 1 when there is an edge connecting node x and node y
axy = 0 otherwise
1
2
3
45
0 1 0 1 0
1 0 1 1 0
0 1 0 0 1
1 1 0 0 1
0 0 1 1 0
1 2 3 4 5
123
45
Representing a Graph
Adjacency List Use a list instead of a matrix For each vertex, we have a linked list of
their neighbor
1
2
3
45
1 2 4
2 1 3 4
. . .
Representing a Graph
Incidences Matrix Row represent edge Column represent node
1
2
3
45
1 1 0 0 0
1 0 0 1 0
0 1 0 1 0
0 1 1 0 0
0 0 1 0 1
0 0 0 1 1
1 2 3 4 5
Exploring a Maze
Exploring Problem
Input: A Graph
Maybe as an adjacency matrix A Starting node v
Output: List of node reachable from v
Maybe as an array indexed by a node
Depth-First-Search
procedure explore(G; v)// Input: G = (V;E) is a graph; v V// Output: visited(u) is set to true for all nodes u reachable from v{ visited(v) = true previsit(v) for each edge (v,u) E if not visited(u)
explore(u) postvisit(v)}
Example
Explore(A)
Extend to Graph Traversal
Traversal is walking in the graph We might need to visit each component
in the graph Can be done using explore
Do “explore” on all non-visited node The result is that we will visit every node
What is the difference between just looking into V (the set of vertices?)
Graph Traversal using DFS
procedure dfs(G){
for all v V visited(v) = falsefor all v V if not visited(v)
explore(v)}
Complexity Analysis
Each node is visited once Each edge is visited twice
Why?
O( |V| + |E|)
Another Example
Another Example
Connectivity in Undirected Graph
If A can reach B Then B can reach A
If A can reach B && B can reach C Then A can reach C
Also C can reach A
Divide V into smaller subset of vertices that can reach each other
Connected Component Problem Input:
A graph Output:
Marking in every vertices identify the connected component Let it be an array ccnum, indexed by
vertices
Solution
Define global variable cc
In previsit() ccnum[v] = cc
Before calling each explore cc++
Ordering in Visit
procedure previsit(v)pre[v] = clockclock = clock + 1
procedure postvisit(v)post[v] = clockclock = clock + 1
Ordering in Visit
•The interval for node u is [pre(u),post(u)]•The inverval for u,v is either• Contained • disjointed• Never intersect
DFS in Directed Graph
Type of Edge in Directed Graph
Directed Acyclic Graph (DAG)
A directed Graph without a cycle Has “source”
A node having only “out” edge Has “sink”
A node having only “in” edge
How can we detect that a graph is a DAG What should be the property of “source” and
“sink” ?
Solution
A directed graph is acyclic if and only if it has no back edge
Sink Having lowest post number
Source Having highest post number
Linearization of Graph
for DAG, we can have an ordering of node
Think of an edge as Causality Time-dependency
AB means A has to be done before B
Linearization ordering of node by causality
Linearization
One possible linearizationB,A,D,C,E,F
Order of work that can be done w/o violating the causality constraints
Topological Sorting Problem
Input: A DAG (non-dag cannot be linearized)
Output: A sequence of vertices
If we have a path from A to B A must come before B in the sequence
Topological Sorting
Do DFS List node by post number
(descending)
1,12
2,9
3,8 4,5
6,7
10,11