ZiliangZiliang

Site navigation

  • Mortgage comparison
  • Japan tax calculator
  • Programming
  • Algorithms
  • Machine learning
  • Misc
Engineering
Contact
中文

Site navigation

  • Mortgage comparison
  • Japan tax calculator
  • Programming
  • Algorithms
  • Machine learning
  • Misc
Engineering
Contact

Article directory

  • Programming Languages

    • Overview
    • Basics
    • Collections
    • Flow Control Statements
    • Function
    • Libraries and Modules
    • IO, File, and OS
    • Errors and Exceptions
    • Object-Oriented Design
    • Namespaces and Scopes
  • Data Structures and Algorithms

    • Overview
    • Math Formula
    • Math Code
    • Misc
    • String
    • Tree Traversal
    • Balanced Binary Trees
    • Heap
    • Segment Tree
    • Dynamic Programming
    • Tree Misc
    • Java
    • Disjoint Sets
    • Graph Traversal
    • Minimum Spanning Tree
    • Single-Source Shortest Paths
    • Strongly Connected Components
    • Cut Vertices and Bridges
    • Cache
    • Binary Search
    • Quicksort
    • Knapsack Problem
    • Vertex Cover Problem
    • Set Cover Problem
    • Principle Component Analysis
    • K-Center Problem

Graph Traversal

Edge Type
Types of Edges[1]
ItemDFSBFS
Data StructureStackQueue
Vertex Orderone sequencetwo sequences
Edge Type (Undirected Graph)tree edge, back edgetree edge, cross edge
Time Complexity (Adjacency Matrix)O(‖V‖2)O(‖V‖2)
Time Complexity (Adjacency List)O(‖V‖+‖E‖)O(‖V‖+‖E‖)
Worst-case Space ComplexityO(‖V‖)O(‖V‖)

Example

Graph

Adjacency Matrix

0123456
00110000
11011000
21100100
30100100
40011010
50000101
60000010

Adjacency List

  • 0: 1 -> 2
  • 1: 0 -> 2 -> 3
  • 2: 0 -> 1 -> 4
  • 3: 1 -> 4
  • 4: 2 -> 3 -> 5
  • 5: 4 -> 6
  • 6: 5

DFS

def dfs(matrix):
    # taking adjacency matrix
    stack = [0]
    visited = set()
    visited.add(0)
    while stack:
        cur = stack.pop()
        # do something
        print(cur)
        for i, adj in enumerate(matrix[cur]):
            if adj and i not in visited:
                visited.add(i)
                stack.append(i)

BFS

from collections import deque

def bfs(lists):
    # taking adjacency list
    q = deque([0])
    visited = [False] * len(lists)
    visited[0] = True
    while q:
        cur = q.popleft()
        # do something
        print(cur)
        for i in lists[cur]:
            if not visited[i]:
                visited[i] = True
                q.append(i)

Level Order Traversal

from collections import deque

def lot(lists) -> int:
    # taking adjacency list
    q = deque([0])
    visited = [False] * len(lists)
    visited[0] = True
    lv = 0
    while q:
        lv += 1
        print(f'level {lv}')
        for _ in range(len(q)):
            cur = q.popleft()
            # do something
            print(cur)
            for i in lists[cur]:
                if not visited[i]:
                    visited[i] = True
                    q.append(i)
    return lv

Tests


  1. Image is from https://www.geeksforgeeks.org/tarjan-algorithm-find-strongly-connected-components/ ↩︎

Edit this page on GitHub
Last Updated: 9/10/26, 7:37 AM
Contributors: Lucien
Prev
Disjoint Sets
Next
Minimum Spanning Tree