Depth First Search#8760

Depth First Search (Editorial)

Let's build an adjacency matrix from the list of edges. Start a depth-first search from the specified vertex . Each time we enter a new vertex, we print its number.

Exercise

Solve the problem for the next graphs:

Algorithm realization — adjacency matrix

Declare an adjacency matrix and an array .

#define MAX 101
int g[MAX][MAX], used[MAX];

The dfs function performs a depth-first search from vertex .

void dfs(int v)
{

Print the vertex .

  printf("%d ", v);

Mark the vertex as visited.

  used[v] = 1;

Iterate over the vertices , that can be reached from . Moving from to is possible if:

If both conditions are true, we continue the depth-first search from vertex .

  for (int i = 1; i <= n; i++)
    if ((g[v][i] == 1) && (used[i] == 0)) dfs(i);
}

The main part of the program. Read the number of vertices and edges in the graph.

scanf("%d %d", &n, &m);}

Initialize the arrays with zeroes.

memset(g, 0, sizeof(g));
memset(used, 0, sizeof(used));

Read the list of edges. Construct the adjacency matrix.

for (i = 0; i < m; i++)
{
  scanf("%d %d", &a, &b);
  g[a][b] = g[b][a] = 1;
}

Read vertex and start a depth-first search from it.

scanf("%d", &v);
dfs(v);
printf("\n");

Algorithm realization — adjacency list

Declare an adjacency list and an array .

vector<vector<int> > g;
vector<int> used;

The dfs function performs a depth-first search from vertex .

void dfs(int v)
{

Mark the vertex as visited.

  used[v] = 1;

Print the vertex .

  printf("%d ", v);

The array contains a list of vertices adjacent to . Iterate over the vertices that can be reached from .

  for (int to : g[v])

Consider the edge (v, to). We can move to vertex from if the vertex is not visited (used[to] = 0).

    if (used[to] == 0) dfs(to);
}

The main part of the program. Read the number of vertices and edges in the graph.

scanf("%d %d", &n, &m);

Set the size of arrays and .

g.resize(n + 1);
used.resize(n + 1);

Read the list of edges. Construct the adjacency list.

for (int i = 0; i < m; i++)
{
  scanf("%d %d", &a, &b);
  g[a].push_back(b);
  g[b].push_back(a);
}

Read vertex and start a depth-first search from it.

scanf("%d", &v);
dfs(v);
printf("\n");

Java realization — adjacency matrix

import java.util.*;

public class Main
{
  static int g[][], used[];
  static int n, m;
  
  static void dfs(int v)
  {
    System.out.printf(v + " ");	  
    used[v] = 1;
    for(int i = 1; i <= n; i++) 
      if (g[v][i] == 1 && used[i] == 0) dfs(i);
  }
  
  public static void main(String[] args)
  {
    Scanner con = new Scanner(System.in);
    n = con.nextInt();
    m = con.nextInt();
    g = new int[n+1][n+1];
    used = new int[n+1];

    for (int i = 0; i < m; i++)
    {
      int a = con.nextInt();
      int b = con.nextInt();      
      g[a][b] = g[b][a] = 1;
    }
    
    int v = con.nextInt();    
    dfs(v);
    System.out.println();    
  }
}

Java realization — array of ArrayList

import java.util.*;

public class Main
{
  static ArrayList<Integer>[] g;	
  static int used[];
  static int n, m;
  
  static void dfs(int v)
  {
    System.out.print(v + " ");	  
    used[v] = 1;
    for(int to : g[v])
      if (used[to] == 0) dfs(to);
  }
  
  public static void main(String[] args)
  {
    Scanner con = new Scanner(System.in);
    n = con.nextInt();
    m = con.nextInt();
    g = new ArrayList[n+1]; // unchecked
    used = new int[n+1];

    for (int i = 1; i <= n; i++)
      g[i] = new ArrayList<Integer>();

    for (int i = 0; i < m; i++)
    {
      int a = con.nextInt();
      int b = con.nextInt();      
      g[a].add(b);
      g[b].add(a);
    }
    
    int v = con.nextInt();    
    dfs(v);
    System.out.println();    

    con.close();
  }
}   

Java realization — ArrayList of ArrayList

import java.util.*;

public class Main
{
  static ArrayList<ArrayList<Integer>> g;	
  static int used[];
  static int n, m;
  
  static void dfs(int v)
  {
    System.out.printf(v + " ");	  
    used[v] = 1;
    for(int i = 0; i < g.get(v).size(); i++)
    {
      int to = g.get(v).get(i);
      if (used[to] == 0) dfs(to);
    }
  }
  
  public static void main(String[] args)
  {
    Scanner con = new Scanner(System.in);
    n = con.nextInt();
    m = con.nextInt();
    g = new ArrayList<ArrayList<Integer>>();
    used = new int[n+1];

    for (int i = 0; i <= n; i++)
      g.add(new ArrayList<Integer>());

    for (int i = 0; i < m; i++)
    {
      int a = con.nextInt();
      int b = con.nextInt();      
      g.get(a).add(b);
      g.get(b).add(a);
    }
    
    int v = con.nextInt();    
    dfs(v);
    System.out.println();    

    con.close();
  }
}   

Python realization

The dfs function performs a depth-first search from vertex .

def dfs(v):

Print the vertex .

  print(v, end = ' ')

Mark the vertex as visited.

  used[v] = True

The list contains the numbers of vertices adjacent to . Iterate over the vertices that can be reached from . It's possible to go to vertex from if vertex is not visited (used[to] = 0).

  for to in g[v]:
    if not used[to]: dfs(to)

The main part of the program. Read the number of vertices and edges in the graph.

n, m = map(int, input().split())

Create the adjacency list and the list .

g = [[] for _ in range(n+1)]
used = [False] * (n + 1)

Read the list of edges. Construct the adjacency list.

for _ in range(m):
  a, b = map(int, input().split())
  g[a].append(b)
  g[b].append(a)

Read vertex and start a depth-first search from it.

v = int(input())
dfs(v)