G = (V,E)

This notation means V is a set of vertices and E is a set of edges. For example

V = (A,B,C,D) E =

### Directed and undirected graph

Graph can be either directed or undirected. For directed graph or digraph edges has a direction.Fig: Undirected Graph

Fig: Directed graph

Multiple copies of and edge is not allowed in a graph. Digraphs may have two edges in opposite direction.

### Weighted graph

A graph G(V,E), either directed or undirected, where each edge u in E has an associated weight with it.Weights can be either positive or negative.

## Terminology

### Path

A sequence of vertices with where each two adjacent vertices are connected by an edge. For a directed graph each edges that connects the adjacend vertices must have a direction aligned to the path.The number of edges in the path is the length of the path.

### Strongly connected

If a graph has edges such that is is a path from any vertex to any other vertex then the graph is strongly connected graph.### Degree of vertex

Number of edges that connects a vertex to other verteices including itself (self edge) is the degree of theat vertex. Self edge is counted once.### Indegree

For digraph number of edges that are directed toward a vertex is the indegree of that vertex.### Outdeegree

For digraph number of edges that are directed away a vertex is the outdegree of that vertex.### Planner graph

A graph that can be drawn on a plane without crossing edges.### Sparse graph

If a graph has fewer number of edges than maximum number of edges possible is called sparse graph.## Graph representation

Graphs, either directed or undirected whether weighted or not, are generally represented in memory as one of two standard ways to represent a graph- using adjacency list or using adjacency matrix.If a graph is sparse adjacency list is used to save memory. For a dense graph adjacency matrix will save memory and will be fast access representation.

To illustrate the two types of representation we'll use the following graphs.

Fig: Undirected graph

Fig: Directed graph

### Adjacency list

Uses array of lists, one list per vertex, where each list contains the items that is adjacent to the vertex that the list represents.[A|*]-->[B|*]-->[C|*]-->[D|$] [B|*]-->[A|*]-->[E|$] [C|*]-->[A|*]-->[D|*]-->[E|$] [D|*]-->[A|*]-->[C|*]-->[F|$] [E|*]-->[B|*]-->[C|*]-->F|$] [F|*]-->[D|*]-->[E|$] Fig: Adjacency list representation for undirected graph

[A|*]-->[A|*]-->[B|*]-->[D|$] [B|*]-->[A|$] [C|*]-->[A|*]-->[E|$] [D|*]-->[C|*]-->[F|$] [E|*]-->[B|$] [F|*]-->[E|$] Fig: Adjacency list representation for digraph

### Adjacency matrix

To represent a graph G(V,E) a matrix of size VxV, requiring O(V^2) memory, is used. Each item a[i,j] in the matrix is 1 (or actual weight for the edge in case of weighted graph) if the edge (i,j) exists in E and NIL (or any convenient value like zero) otherwise.A B C D E F _ _ A | 0 1 1 1 0 0 | B | 1 0 0 0 1 0 | C | 1 0 0 1 1 0 | D | 1 0 1 0 0 1 | E | 0 1 1 0 0 1 | F | 0 0 0 1 1 0 | - - Fig: Adjacency matrix representation for undirected graph

A B C D E F _ _ A | 1 1 0 1 0 0 | B | 1 0 0 0 0 0 | C | 1 0 0 0 1 0 | D | 0 0 1 0 0 1 | E | 0 1 0 0 0 0 | F | 0 0 0 0 1 0 | - - Fig: Adjacency matrix representation for digraph

## Graph traversals

The process of visiting each vertex of the graph once is called graph traversal.### Depth-first search (DFS)

Visits deeper level nodes first before visiting any sibling of the current node.Uses stack or recursive method to keep track of adjacent nodes that are not visited yet.

DFS(G, u) for each vertex u in G if u.visited != true v.visited = true distance = distance + 1 u.distance = distance for each vertex v in Adjacent(u) if v.visited = false v.prev = u DFS(G, v)

### BFS

Visits all current level nodes first before visiting any deeper level nodes.Uses a queue to keep track of adjacent nodes.

Finds the distances from source vertex or the root.

## Topological Sort

A directed acyclic graph that defines the order of edges. In a graph G each directed edge (u,v) indicates that e mush come before v in the ordering in G. In G nodes may indicate ordered events. If G has a cycle topological sorting is not possible.Implementation: a. Using DFS. O(V+E) b. Repeat: Find a vertex of indegree = 0 and output it- remove the vertex and all its outgoing edges Until: No edge exists. O(V+E)

## Minimum Spanning Tree

### Kruskal's Algorithm

Kruskal's algorithm first creates a new graph G' with all the nodes of graph G. The hew graph initially has no edge. Then it takes edges in increasing order and adds two trees together to form a new bigger tree. An edge is only selected if the two nodes it is connecting is not already part of a tree. The process continues until there is no edge available to connect two trees.We can use a disjoint set determine if two nodes are in same set.

### The algorithm

Take all nodes and create disjoint sets those initially contains one node. Create a sorted list of all the edges by their weight in increasing order. Selected Edges = empty While the list is not empty Remove the smallest weighted edge E from the list. If the nodes N1 and N2 those are connected by E is not in same set Put E into Selected Edges Union the sets that contains N1 and N2