420 likes | 437 Views
Dive deep into graph algorithms, exploring traversal methods, connectivity, and linearization in graphs. Understand DFS, BFS, connectivity analysis, and topological sorting. Learn how to detect directed acyclic graphs and solve shortest path problems.
E N D
NatteeNiparnan GRAPH ALGORITHM
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)) 2 1 3 4 5 6 7
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 4 5 2 1 1 2 3 3 4 4 5 5
Representing a Graph • Adjacency List • Use a list instead of a matrix • For each vertex, we have a linked list of their neighbor 2 1 2 4 1 2 1 3 4 3 . . . 4 5
Representing a Graph • Incidences Matrix • Row represent edge • Column represent node 1 2 3 4 5 2 1 3 4 5
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 void 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 • void dfs(G) • { • for all v V • visited[v] = false • for 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|)
Connectivity in Undirected Graph • If Acan 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(v) • ccnum[v] = cc • Before calling each explore • cc++
Ordering in Visit void previsit(v) pre[v] = clock++ void postvisit(v) post[v] = clock++
Ordering in Visit • The interval for node u is [pre(u),post(u)] • The inverval for u,v is either • Contained • disjointed • Never intersect
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 linearization B,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) 3,8 4,5 2,9 6,7 1,12 10,11
Distance of nodes • The distance between two nodes is the length of the shortest path between them SA 1 SC 1 SB 2
DFS and Length • DFS finds all nodes reachable from the starting node • But it might not be “visited” according to the distance
Ball and Strings We can compute distance by proceeding from “layer” to “layer”
Shortest Path Problem (Undi, Unit) • Input: • A graph, undirected • A starting node S • Output: • A label on every node, giving the distance from S to that node
Breadth-First-Search • Visit node according to its layer procedure bfs(G, s) //Input: Graph G = (V,E), directed or undirected; vertex s V //Output: visit[u] is set to true for all nodes u reachable from v for each v V visited[v] = false visited[s] = true Queue Q = [s] //queue containing just s while Q is not empty v = Q.dequeue() previsit(v) visited[v] = true for each edge (v,u) E if not visited[u] visited[u] = true Q.enqueue(u) postvisit(v)
Distance using BFS procedure shortest_bfs(G, s) //Input: Graph G = (V,E), directed or undirected; vertex s V //Output: For all vertices u reachable from s, dist(u) is set to the distance from s to u. for all v V dist[v] = -1 dist[s] = 0 Queue Q = [s] //queue containing just s while Q is not empty v = Q.dequeue() for all edges (v,u) E if dist[u] = -1 dist[u] = dist[v] + 1 Q.enqueue(u) Use dist as visited
DFS by Stack procedure dfs(G, s) //Input: Graph G = (V,E), directed or undirected; vertex s V //Output: visited[u] is true for any node u reachable from v for each v V visited[v] = false visited[s] = true Stack S = [s] //queue containing just s while S is not empty v = S.pop() previsit(v) visited[v] = true for each edge (v,u) E if not visited[u] visited[u] = true S.push(u) postvisit(v)
DFS vs BFS • DFS goes depth first • Trying to go further if possible • Backtrack only when no other possible way to go • Using Stack • BFS goes breadth first • Trying to visit node by the distance from the starting node • Using Queue